Java Math RoundingMode.HALF_EVEN打印出意外的结果

时间:2017-03-03 04:45:42

标签: java math rounding

我试图调试一个问题,舍入为HALF_EVEN我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 ?????** 


}

1 个答案:

答案 0 :(得分:2)

new BigDecimal(377.3450)

仅此一行就失去了BigDecimal的所有优势,因为你首先在double传递了所有的优势,而且你所做的所有四舍五入都没有想。

写作,而不是

new BigDecimal("377.3450")

...并且通常在任何地方使用String构造函数。在你获得"权利"回答,浮点舍入得到了幸运并朝着正确的方向前进。