使用 HALF_UP 舍入模式舍入时 BigDecimal 的惊人行为
Surprising behaviour of BigDecimal when rounding with HALF_UP rounding mode
我正在从 0.495 的双精度值创建一个 BigDecimal,并使用 HALF_UP
舍入模式将其打印为两位小数。这是代码:
BigDecimal d = new BigDecimal(0.495);
d = d.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(d.toPlainString());
我希望看到 0.50 作为结果,但我看到的却是 0.49。如果丢弃的分数是 >= .5.
,ROUND_HALF_UP
应该四舍五入
为什么我会看到这种行为?
写的时候
new BigDecimal(0.495)
您正在将 double
值传递给 BigDecimal
构造函数。双精度值是近似值。在这种情况下,您的 BigDecimal
实例的值从实例化时起略低于 0.495
。
如果您传递的是字符串而不是双精度值,BigDecimal
将代表字符串指示的准确值。
所以使用
BigDecimal d = new BigDecimal("0.495");
我正在从 0.495 的双精度值创建一个 BigDecimal,并使用 HALF_UP
舍入模式将其打印为两位小数。这是代码:
BigDecimal d = new BigDecimal(0.495);
d = d.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(d.toPlainString());
我希望看到 0.50 作为结果,但我看到的却是 0.49。如果丢弃的分数是 >= .5.
ROUND_HALF_UP
应该四舍五入
为什么我会看到这种行为?
写的时候
new BigDecimal(0.495)
您正在将 double
值传递给 BigDecimal
构造函数。双精度值是近似值。在这种情况下,您的 BigDecimal
实例的值从实例化时起略低于 0.495
。
如果您传递的是字符串而不是双精度值,BigDecimal
将代表字符串指示的准确值。
所以使用
BigDecimal d = new BigDecimal("0.495");