使用 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");