BigDecimal 舍入:价格值中的 doubleValue() 与 setScale(2, BigDecimal.ROUND_HALF_UP)

问题描述 投票:0回答:2

我一直使用

BigDecimal
来获取价格,但我想知道向用户展示这一点的最佳方式是什么。

  • 使用
    doubleValue()
    是个好方法吗?
  • 这两个选项有什么区别吗?
java bigdecimal currency-formatting
2个回答
1
投票

使用 doubleValue() 是个好方法吗?

如果您想避免使用

double
(或者您想控制数字的格式),那么使用 BigDecimal 是有意义的。如果你混合
BigDecimal
double
我不明白有什么意义。您也可以一直使用
double
并简化您的代码。

如果要将值转换为字符串,请使用

toString
例如

BigDecimal bd = ...
System.out.println("bd: " + bd.toString());

或者只是

System.out.println("bd: " + bd);

如果你想使用

double
你可以做

double d = 
System.out.printf("%.2f%n", d); // round to 2 decimal places

举例说明为什么 BigDecimal 比 double 更容易出错。 这两个答案都是错误的,但是在

BigDecimal
的情况下,无论是在代码中还是在看起来不错的结果中,这并不明显

System.out.println(BigDecimal.valueOf(1.00)
                             .divide(BigDecimal.valueOf(49), 2, BigDecimal.ROUND_HALF_UP)
                             .multiply(BigDecimal.valueOf(49)));
System.out.println(1.00 / 49 * 49);

打印

0.98
0.9999999999999999

您可以修复这两个代码,但很容易忽略第一种情况存在问题的事实。提示:使用

BigDecimal.valueOf
不是问题。 代码越冗长(使用的符号越多),就越难看到重要的细节。


1
投票

我建议向用户显示 setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() 。

© www.soinside.com 2019 - 2024. All rights reserved.