java - java - 为什么使用RoundingMode时java BigDecimal除法结果与双除法不同
问题描述
我一直在研究用 编写的公差计算代码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
如果必须执行舍入以生成具有指定比例的结果,则应用指定的舍入模式。
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
推荐阅读
- powermockito - PowerMock whenNew 仍然进入构造函数代码
- javascript - 是否可以在生命周期内(beforeCreate)导入 vue 组件文件?
- java - JUnit 5 - 为整个测试套件提供设置和拆卸
- powershell - 防止powershell提示关闭,直到作业完成
- android - Android 找不到文件/目录
- python - Python程序从第二列的值计算表达式(方程)
- swift - Swift 4-如何在一个 Xib 文件中使用两个视图控制器?
- python - 创建一个计算有条件日期之间频率的函数
- swift - 试图在 iOS (swift) 中使用 Facebook Graph API 获取“age_range”,但它缺少“最大值”值?
- react-native - 未调用 ReactNative TextInput' onChangeText