如何正确显示最高两位小数(美分)的价格,包括Java中的尾随零?

den*_*chr 6 java double decimal-point rounding

有在Java的舍入小数一个很好的问题在这里.但我想知道如何在我的程序中包含尾随零以显示价格:$ 1.50,$ 1.00

简单的解决方案

String.format("%.2g%n", 0.912385);
Run Code Online (Sandbox Code Playgroud)

工作正常,但如果它在最后一个小数位,则省略尾随零.虽然我只使用这样的表达式,但我的程序出现了这个问题:

double price = 1.50;
Run Code Online (Sandbox Code Playgroud)

当我使用不同的价格(添加,乘法等)进行计算时,结果主要显示如下:

$2.5000000000000003
Run Code Online (Sandbox Code Playgroud)

因此,使用String.format可以正常工作,但它会将上面的示例截断为

$2.5
Run Code Online (Sandbox Code Playgroud)

是否有正确的方法在小数点后第二位显示尾随零?如果计算的输出应该是,则两者都为零

$2.00
Run Code Online (Sandbox Code Playgroud)

duf*_*ymo 19

我建议你这样做:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
double price = 2.50000000000003;
System.out.println(currencyFormatter.format(price));
Run Code Online (Sandbox Code Playgroud)

这具有特定于语言环境的优点.例如,如果您在欧元区而不是美国,这将有效.


Pas*_*ent 14

虽然其他答案是完全有效的(尤其是duffymo的答案),但是比格式化显示器有更大的问题.实际上,您使用完全错误的类型作为离散值的金额.而不是double,你应该考虑使用java.lang.BigDecimal.

(编辑:......或者作为duffymo的一个很好实现的Money类在评论中指出,例如来自JScience的货币模块的类或更新的Joda-Money - 它仍然作为官方版本发布.)


Bar*_*ers 11

它可以用String.format(...)完成,但你可以使用DecimalFormat:

double price = 2.50000000000003;
DecimalFormat formatter = new DecimalFormat("$0.00");
System.out.println(formatter.format(price)); // print: $2.50
Run Code Online (Sandbox Code Playgroud)