BigDecimal.ROUND_HALF_UP和BigDecimal.ROUND_HALF_DOWN的区别

来源:互联网 发布:w网络资源管理系统 编辑:程序博客网 时间:2024/05/01 10:34
BigDecimal.ROUND_HALF_UP
在java jdk的解释为:向“ 最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。注意,这是我们大多数人在小学时就学过的舍入模式。

BigDecimal.ROUND_HALF_DOWN
在java jdk的解释为:向“ 最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。

这两者的区别主要在于:一个是舍弃部分 >= 0.5,另一个是舍弃部分 > 0.5 什么理解呢?看下面的例子就明白了

public class BigDecimalTest{
    public static void main(String[] args){
        double num = 100.0555;
        BigDecimal b = new BigDecimal(Double.toString(num));
        num = b.setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println("sample-->"+num);
        
    }
}

程序的输出结果为:100.056

输出结果为保留三位小数,因为BigDecimal的属性是ROUND_HALF_UP,num的舍弃部分为:0.0005 = 0.5,符合舍弃部分>=0.5,所以会向上进一,如果舍弃部分是0.0004
则不会向上进一。


如果把语句    num = b.setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue();
换成:
num = b.setScale(3,BigDecimal.ROUND_HALF_DOWN).doubleValue();

则输出结果为:100.055
因为BigDecimal的属性是ROUND_HALF_DOWN,num的舍弃部分为:0.0005 = 0.5,没有>0.5, 所以不会向上进一,如果舍弃部分是0.00056
就会向上进一。
原创粉丝点击