为什么在使用 RoundingMode 时 java BigDecimal 除法结果与 Double 除法结果不同
Why Does java BigDecimal division results different than Double division when using RoundingMode
我一直在研究用 Double
编写的公差计算代码,存在精度和舍入问题我决定继续使用 BigDecimal
考虑到它更精确并且不太可能遇到舍入问题。
在计算中,一段代码在划分值时使用 Math.floor()
和 Math.Ceil
。
奇怪的是,ROUNDING_MODE.floor
和 ceil
在使用 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
我错过了什么。 ?
提前致谢
引用Javadoc
If rounding must be performed to generate a result with the specified scale, the specified rounding mode is applied.
5.5
当scale为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
我一直在研究用 Double
编写的公差计算代码,存在精度和舍入问题我决定继续使用 BigDecimal
考虑到它更精确并且不太可能遇到舍入问题。
在计算中,一段代码在划分值时使用 Math.floor()
和 Math.Ceil
。
奇怪的是,ROUNDING_MODE.floor
和 ceil
在使用 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
我错过了什么。 ?
提前致谢
引用Javadoc
If rounding must be performed to generate a result with the specified scale, the specified rounding mode is applied.
5.5
当scale为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