BigDecimal 回合:价格值中的 doubleValue() 与 setScale(2, BigDecimal.ROUND_HALF_UP)
BigDecimal round: doubleValue() vs setScale(2, BigDecimal.ROUND_HALF_UP) in price values
我一直在使用 BigDecimal
查询价格,但我想知道向用户展示此信息的最佳方式是什么。
- 使用
doubleValue()
是个好方法吗?
- 这两个选项有什么区别吗?
Is using doubleValue() a good way?
如果您想避免使用 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
不是问题。代码越冗长(使用的符号越多),就越难看到重要的细节。
我建议向用户显示 setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()。
我一直在使用 BigDecimal
查询价格,但我想知道向用户展示此信息的最佳方式是什么。
- 使用
doubleValue()
是个好方法吗? - 这两个选项有什么区别吗?
Is using doubleValue() a good way?
如果您想避免使用 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
不是问题。代码越冗长(使用的符号越多),就越难看到重要的细节。
我建议向用户显示 setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()。