printf 方法中的多个参数

multiple arguments in a printf method

我正在为我的 Java class 编写代码,要求我创建看起来像 bill/receipt 的东西。 类似于:

    Item                    quantity                    price            total
    gum                     10                          .49            .90
    soda                    3                           .00            .00
    chips                   20                          .25            .00

我正在使用 printf();方法。我声明的变量是

    double gumPrice = 1.49;
    float gumQuantity = 10;
    double gumTotal = 14.90;
    double sodaPrice = 1.00;
    float sodaQuantity = 3;
    double sodaTotal = 3.00;
    double chipsPrice = 1.25;
    float chipsQuantity = 20;
    double chipsTotal = 25.00;

我需要创建一些 printf();以这种方式列出数据的语句。

这是我目前为止的口香糖,它给我一个错误。

        System.out.printf("%-30s %-10.2f %-10.2f %-5.2f", "Gum",gumQuantity,"$"+gumPrice,"$"+gumTotal);

在 printf() 中放入双精度数的正确方法是什么?在一行中列出多个参数时?

最初的问题是由于 Java 输出格式 String 连接和 printf 格式的两种格式化方法不正确混合造成的。正如评论中指出的那样,"$"+gumPrice 是一个字符串,而不是双精度数。它必须具有 %s 格式,而不是 printf 中的 %f。但是,最好选择一种格式化方式并坚持使用。

采用 printf 方法,我认为在这种情况下更好,输出行变为:

System.out.printf("%-30s %-10.2f $%-10.2f $%-5.2f", "Gum",gumQuantity,gumPrice,gumTotal);

并打印:

Gum                            10.00      .49       .90

如果您使用字符串连接方法,则需要使用 DecimalFormat 显式转换 doubles 以强制保留两位小数。

避免 double 金额的原因是许多短终止小数只能近似表示。您的 gumPrice 实际上是 1.4899999999999999911182158029987476766109466552734375,这与您想要的略有不同。另一方面,new BigDecimal("1.49") 正好是 1.49。在某些情况下,特别是如果您需要截断而不是舍入到最接近的值,double 引入的微小差异可能很重要,因此 BigDecimal 对于货币计算更安全。