我正在为我的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()的正确方法是什么?在一行中列出多个参数?
答案 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
对货币计算更安全。