Java 数学 RoundingMode.HALF_EVEN 打印意外结果
Java Math RoundingMode.HALF_EVEN prints unexpected result
我试图调试 HALF_EVEN i java 的舍入问题,
正如您在下面看到的,意外结果是 377.35,我们本可以预期它会打印 377.34?
有人可以帮忙解释一下这种行为吗?
public static void main(String[] args) {
System.out.println((new BigDecimal(0.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString());
//prints 0.34
System.out.println((new BigDecimal(77.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString());
//prints 77.34
System.out.println((new BigDecimal(377.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString());
**//prints 377.35 ?????**
//anything larger than 256 is printing .35
System.out.println((new BigDecimal(255.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString());
//prints 255.34
System.out.println((new BigDecimal(256.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString());
**//prints 256.35 ?????**
}
new BigDecimal(377.3450)
仅这一行就失去了 BigDecimal
的所有优点,因为您首先传入了 double
,这会进行您不想要的所有舍入。
改为
new BigDecimal("377.3450")
...并且通常到处都使用 String
构造函数。在您得到 "right" 答案的情况下,浮点舍入 幸运 并朝着正确的方向前进。
我试图调试 HALF_EVEN i java 的舍入问题, 正如您在下面看到的,意外结果是 377.35,我们本可以预期它会打印 377.34?
有人可以帮忙解释一下这种行为吗?
public static void main(String[] args) {
System.out.println((new BigDecimal(0.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString());
//prints 0.34
System.out.println((new BigDecimal(77.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString());
//prints 77.34
System.out.println((new BigDecimal(377.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString());
**//prints 377.35 ?????**
//anything larger than 256 is printing .35
System.out.println((new BigDecimal(255.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString());
//prints 255.34
System.out.println((new BigDecimal(256.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString());
**//prints 256.35 ?????**
}
new BigDecimal(377.3450)
仅这一行就失去了 BigDecimal
的所有优点,因为您首先传入了 double
,这会进行您不想要的所有舍入。
改为
new BigDecimal("377.3450")
...并且通常到处都使用 String
构造函数。在您得到 "right" 答案的情况下,浮点舍入 幸运 并朝着正确的方向前进。