我一直在编写用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);我希望为如此小的除法打印相同的值,但是我得到了跟踪,地板和细胞似乎没有像预期的那样计算。
5.0
6.0
5.5
5.5我错过了什么。?
先谢谢你
发布于 2020-07-06 22:18:12
引用Javadoc
如果必须执行舍入才能生成具有指定比例的结果,则应用指定的舍入模式。
当刻度为1时,5.5不需要四舍五入,因此不应用舍入模式。
如果标度为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
6https://stackoverflow.com/questions/62765228
复制相似问题