使用HALF_UP舍入模式进行舍入时BigDecimal的令人惊讶的行为

时间:2017-05-15 11:41:10

标签: java math rounding bigdecimal

我正在从0.495的double值创建一个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。如果丢弃的分数为ROUND_HALF_UP

>= .5.应该向上舍入

那为什么我会看到这种行为?

1 个答案:

答案 0 :(得分:3)

写作时

new BigDecimal(0.495)

您正在将double值传递给BigDecimal构造函数。双值是近似值。在这种情况下,您的BigDecimal实例的值在0.495之下,距离实例化的位置。{/ p>

如果传递字符串而不是double,BigDecimal将表示字符串指示的确切值。

所以使用

BigDecimal d = new BigDecimal("0.495");