java - RoundingMode 的工作原理
问题描述
我有点困惑RoundingMode.HALF_UP
,,,RoundingMode.HALF_EVEN
。RoundingMode.HALF_DOWN
有人可以举个例子吗?
最近我正在浏览一些我发现的代码:
这将返回 3.00 -- 这是正确的
new BigDecimal(9.00).divide(new BigDecimal(3.00, 2, RoundingMode.HALF_UP)
这将返回 2.99——我无法理解
new BigDecimal(8.97).divide(new BigDecimal(3.00, 2, RoundingMode.HALF_UP)
这将返回 2.99——我无法理解
new BigDecimal(8.98).divide(new BigDecimal(3.00, 2, RoundingMode.HALF_UP)
这将返回 3.00 - 我无法理解
new BigDecimal(8.99).divide(new BigDecimal(3.00, 2, RoundingMode.HALF_UP)
解决方案
正如 Javadoc 中为divide指定的那样,该divide
操作返回具有给定小数位数(即小数位数)的 BigDecimal。所以我们期望结果有 2 个小数位,在 1/2/3/4 的情况下。
处理几个案例:
案例2
请注意299*3=897
, 因此8.97/3
完全等于2.99
。该数字2.99
可以使用 2 个小数位精确表示(不损失精度)。所以得到的 bigDecimal 值为 2.99。编码
System.out.println(8.97/3.);
System.out.println(new BigDecimal(8.97).divide(new BigDecimal(3.), 2, RoundingMode.HALF_UP));
将输出:
2.99
2.99
案例3
由于8.98/3=2.993333333..
,结果不能用 精确表示scale=2
,需要进行一些舍入。如RoundingMode.HALF_UP中所述,该数字四舍五入到最接近的数字(小数点后 2 位)。如果我们向下取整,我们到达2.99
,如果我们向上取整,我们到达3.0
。最接近的四舍五入为2.99
,因此2.99333333..
向下舍入为2.99
。编码
System.out.println(8.98/3.);
System.out.println(new BigDecimal(8.98).divide(new BigDecimal(3.00), 2, RoundingMode.HALF_UP));
输出:
2.9933333333333336
2.99
案例4
这里8.99/3=2.9966666..
需要四舍五入。同样,最近的邻居是:(2.99
如果我们向下取整)和3.0
(如果我们向上取整)。最接近的数字是3.0
。代码
System.out.println(8.99/3.);
System.out.println(new BigDecimal(8.99).divide(new BigDecimal(3.00), 2, RoundingMode.HALF_UP));
将输出
2.9966666666666666
3.00
推荐阅读
- nginx - Nginx 在用作反向代理时不会扩展超过 750 个连接
- machine-learning - ConvLSTM 的训练和标签数据形状不兼容
- java - 打开下载的(使用 VirtualFile.open())excel 文件时,提示恢复消息
- laravel - Laravel 地平线在新部署后仍然处于非活动状态
- python - 斐波那契与 Python:IndexError:列表索引超出范围
- android - 使用 fastlane 将 Android 应用程序上传到 Fabric 显示此错误“获取远程文件时出错:对等方重置连接 - SSL_connect”
- javascript - 通过 JavaScript 进行 HTML 5 视频流的事件
- php - 如何使用 laravel 将两个对象合并为一个对象
- elasticsearch - 我如何知道两个不同的聚合是否聚合了相同的文档?
- python - DialogFlow Python3 Webhook - 增加超时?