首页 > 解决方案 > RoundingMode 的工作原理

问题描述

我有点困惑RoundingMode.HALF_UP,,,RoundingMode.HALF_EVENRoundingMode.HALF_DOWN

有人可以举个例子吗?

最近我正在浏览一些我发现的代码:

  1. 这将返回 3.00 -- 这是正确的

    new BigDecimal(9.00).divide(new BigDecimal(3.00, 2, RoundingMode.HALF_UP)
    
  2. 这将返回 2.99——我无法理解

    new BigDecimal(8.97).divide(new BigDecimal(3.00, 2, RoundingMode.HALF_UP)
    
  3. 这将返回 2.99——我无法理解

    new BigDecimal(8.98).divide(new BigDecimal(3.00, 2, RoundingMode.HALF_UP)
    
  4. 这将返回 3.00 - 我无法理解

    new BigDecimal(8.99).divide(new BigDecimal(3.00, 2, RoundingMode.HALF_UP)
    

标签: java

解决方案


正如 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

推荐阅读