printf方法中的多个参数

时间:2015-02-25 01:08:50

标签: java printf double

我正在为我的Java类编写一个代码,该代码要求我创建一个看起来像账单/收据的东西。 类似于:

    Item                    quantity                    price            total
    gum                     10                          $1.49            $14.90
    soda                    3                           $1.00            $3.00
    chips                   20                          $1.25            $20.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);

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

1 个答案:

答案 0 :(得分:2)

最初的问题是由于两种格式化Java输出,String连接和printf格式化的方法混合不正确。正如评论中指出的那样,"$"+gumPrice是一个String,而不是double。它必须具有%s格式,而不是%f中的printf格式。但是,最好选择一种进行格式化的方法,并坚持下去。

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

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

并打印:

Gum                            10.00      $1.49       $14.90

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

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