首页 > 解决方案 > java - 为什么使用RoundingMode时java BigDecimal除法结果与双除法不同

问题描述

我一直在研究用 编写的公差计算代码Double,有精度和舍入问题我决定继续BigDecimal考虑它更精确并且不太可能遇到舍入问题。在计算中,一段代码在划分值时使用Math.floor()和。Math.Ceil

奇怪的观察结果在使用ROUNDING_MODE.floorceil实际上并不适用BigDecimal,这是最小的可重现示例。

Double doubleFloor = Math.floor(5.5/1.0);
Double doubleCeil = Math.ceil(5.5/1.0);
System.out.println(doubleFloor);
System.out.println(doubleCeil);  
    
BigDecimal bigDecimalFloor = BigDecimal.valueOf(5.5).divide(BigDecimal.ONE,1,RoundingMode.FLOOR);
BigDecimal bigDecimalCeil = BigDecimal.valueOf(5.5).divide(BigDecimal.ONE,1,RoundingMode.CEILING);
System.out.println(bigDecimalFloor);
System.out.println(bigDecimalCeil);

我希望为这样的小部门打印相同的值,但是我得到以下结果, floor 和 ceil 似乎没有按预期计算。

5.0
6.0
5.5
5.5

我错过了什么。?

先感谢您

标签: javabigdecimalfloorceil

解决方案


引用Javadoc

如果必须执行舍入以生成具有指定比例的结果,则应用指定的舍入模式。

5.5scale 为 1 时不需要四舍五入,因此不应用四舍五入模式。

如果比例为0 Math.floor,它会像这样工作:Math.ceil

BigDecimal bigDecimalFloor = BigDecimal.valueOf(5.5).divide(BigDecimal.ONE,0,RoundingMode.FLOOR);
BigDecimal bigDecimalCeil = BigDecimal.valueOf(5.5).divide(BigDecimal.ONE,0,RoundingMode.CEILING);
System.out.println(bigDecimalFloor);
System.out.println(bigDecimalCeil);

输出

5
6

推荐阅读