请问如何在Java中使用 printf();时保留小数位

Java初学者写了一段超简单的代码,成功运行。
为了在输出时保留小数位,在第43、48、49行代码改用了printf(); 报错如下。
请问各位,这是为什么?

import java.util.Scanner;
class CashierDest
{
    public static void main(String[] args) 
    {

    /* 变量名注释
    商品名称        单价            商品数量    商品金额小计    数量总计    金额总计
    goodsNname[]    goodsPrice[]    goodsNum[]    goodsMoney[]    numSum        goodsMoneySum
    */
    System.out.println("欢迎使用收银系统");
    /*
    要实现的收银结果界面
    商品    单价    数量    商品金额小计
    A                    
    ~
    F

    数量总计:
    金额总计:
    */
    char []goodsName=new char[]{'A','B','C','D','E','F'};    //声明、创建并赋值含有商品名的char型数组
    
    double[] goodsPrice=new double[6];    //声明并创建含有单价、数量和小计的double型数组
    double[] goodsNum=new double[6];
    double[] goodsMoney=new double[6];
    double goodsNumSum=0;    //声明并初始化表示总数和总计的变量
    double goodsMoneySum=0;
    Scanner in = new Scanner(System.in);
    System.out.println("请按顺序输入商品单价和数量,以空格键隔开,最后以Enter键结束");    //提示输入商品单价和数量
    for(int i=0;i<6;i++) {    //输入商品名称、单价和商品数量,计算商品金额小计、数量总计、金额总计
        System.out.println("商品"+goodsName[i]+":");
        goodsPrice[i]=in.nextDouble();
        goodsNum[i]=in.nextDouble();
        goodsMoney[i]=goodsPrice[i]*goodsNum[i];
        goodsNumSum+=goodsNum[i];
        goodsMoneySum+=goodsMoney[i];
    }
    System.out.println("");
    System.out.println("商品    单价(元)    数量    商品金额小计(元)");    //输出收银结果
    for(int i=0;i<6;i++) {
        System.out.println();
        System.out.printf("%.3lf    %.3lf    %.3lf    %.3lf    ",goodsName[i],goodsPrice[i],goodsNum[i],goodsMoney[i]);    //模仿C语言的输出方式
        //System.out.println(goodsName[i]+"    "+goodsPrice[i]+"    "+goodsNum[i]+"    "+goodsMoney[i]);    无法保留小数点
        
     }
    System.out.println("");
    System.out.printf("数量总计:%.3lf\n",goodsNumSum);
    System.out.printf("金额总计:%.3lf 元",goodsMoneySum);
    }
}

运行结果如下:

欢迎使用收银系统
请按顺序输入商品单价和数量,以空格键隔开,最后以Enter键结束
商品A:
4.556 5
商品B:
5 5
商品C:
5 5
商品D:
5 5
商品E:
5 5
商品F:
5 5

商品 单价(元) 数量 商品金额小计(元)

Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = 'l'
at java.base/java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2855)
at java.base/java.util.Formatter$FormatSpecifier.(Formatter.java:2891)
at java.base/java.util.Formatter.parse(Formatter.java:2747)
at java.base/java.util.Formatter.format(Formatter.java:2671)
at java.base/java.io.PrintStream.format(PrintStream.java:1209)
at java.base/java.io.PrintStream.printf(PrintStream.java:1105)
at CashierDest.CashierDest.main(CashierDest.java:44)

%.3lf 改完 %.3f 多了个l

你把/换成\

img

第一点,不存在LF,代码里是要替换成f的;
第二点,你一个char[]数组goodsName在输出时可就不是%f了,这个是double类型的占位符,人家上面评论说的没毛病,换完之后报错没发现不一样么,
Exception in thread "main" java.util.IllegalFormatConversionException: f != java.lang.Character
要学会翻译错误信息,改完后明显报的转换异常,尤其是做代码的,不知道基本的运行时异常,光面试就知道你花的研究的时间不够,达不到工作的水平,按住ctrl点进方法里,学着看它源码,以后都是你装*的资本