原 BigDecimal八大模式详解
版权声明:本文为博主原创文章,请尊重他人的劳动成果,转载请附上原文出处链接和本声明。
本文链接:https://www.91mszl.com/zhangwuji/article/details/1431
例子:
1.1) new BigDecimal("1.010").setScale(2, BigDecimal.ROUND_UP); 结果为:1.01
1.2) new BigDecimal("1.01001").setScale(2, BigDecimal.ROUND_UP); 结果为:1.02
解释:
1.1) new BigDecimal("1.010").setScale(2, BigDecimal.ROUND_UP); 保留两位小数,第三位数是0不做任务处理,所以结果为:1.01
1.2) new BigDecimal("1.01001").setScale(2, BigDecimal.ROUND_UP); 保留两位小数,我们将小数点往后移动两位,移动后的结果为:101.001,
然后我们将小数点前的数值看成是0,则结果为 0.001 > 0则进一位,所以结果为:1.02
例子:
2.1) new BigDecimal("1.099").setScale(2, BigDecimal.ROUND_DOWN); 结果为:1.09
解释:
2.1) new BigDecimal("1.099").setScale(2, BigDecimal.ROUND_DOWN); 保留两位小数,不论第三位数字是多少,都直接舍弃,所以结果为:1.09
例子:
3.1) new BigDecimal("1.0790001").setScale(2, BigDecimal.ROUND_CEILING); 结果为:1.08
3.2) new BigDecimal("-1.0790001").setScale(2, BigDecimal.ROUND_CEILING); 结果为:-1.07
解释:
3.1) new BigDecimal("1.0790001").setScale(2, BigDecimal.ROUND_CEILING); 保留两位小数,其结果为正数,则遵循BigDecimal.ROUND_UP规则,我们将小数点往后移动两位,
移动后的结果为:107.90001,然后我们将小数点前的数值看成是0,则结果为:0.90001 > 0则进一位,所以结果为:1.08
3.2) new BigDecimal("-1.0790001").setScale(2, BigDecimal.ROUND_CEILING); 保留两位小数,其结果为负数,则遵循BigDecimal.ROUND_DOWN规则,直接从第二位开始截断,不论第三位数是多少,
所以结果为:-1.07
例子:
4.1) new BigDecimal("1.0790001").setScale(2, BigDecimal.ROUND_FLOOR); 结果为:1.07
4.2) new BigDecimal("-1.0790001").setScale(2, BigDecimal.ROUND_FLOOR);结果为:-1.08
解释:
4.1) new BigDecimal("1.0790001").setScale(2, BigDecimal.ROUND_FLOOR); 保留两位小数,其结果为正数,则遵循BigDecimal.ROUND_DOWN规则,直接从第二位开始截断,不论第三位数是多少,
所以结果为:1.07
4.2) new BigDecimal("-1.0790001").setScale(2, BigDecimal.ROUND_FLOOR); 保留两位小数,其结果为负数,则遵循BigDecimal.ROUND_UP规则,我们将小数点往后移动两位,
移动后的结果为:-107.90001,然后我们将小数点前的数值看成是0,则结果为:0.90001 > 0则进一位,所以结果为:-1.08
例子:
5.1) new BigDecimal("1.075").setScale(2, BigDecimal.ROUND_HALF_UP); 结果为:1.08
5.2) new BigDecimal("1.074").setScale(2, BigDecimal.ROUND_HALF_UP); 结果为:1.07
解释:四舍五入,这个没什么要解释的
例子:
6.1) new BigDecimal("27.67501").setScale(2, BigDecimal.ROUND_HALF_DOWN); 结果为:27.68
6.2) new BigDecimal("27.67500").setScale(2, BigDecimal.ROUND_HALF_DOWN); 结果为:27.67
解释:
6.1) new BigDecimal("27.67501").setScale(2, BigDecimal.ROUND_HALF_DOWN); 保留两位小数,我们将27.67501的小数点向后移动2位,移动后的结果为 2767.501,
然后我们将小数点前的数值看成是0,此时值为0.501 > 0.5 则遵循BigDecimal.ROUND_UP规则,所以结果为:27.68
6.2) new BigDecimal("27.67500").setScale(2, BigDecimal.ROUND_HALF_DOWN); 保留两位小数,我们将27.67500的小数点向后移动2位,移动后的结果为 2767.500,
然后我们将小数点前的数值看成是0,此时值为0.500 不大于 0.5 则遵循BigDecimal.ROUND_DOWN规则,所以结果为:27.67
例子:
7.1) new BigDecimal("27.6749").setScale(2, BigDecimal.ROUND_HALF_EVEN); 结果为:27.67
7.2) new BigDecimal("27.6769").setScale(2, BigDecimal.ROUND_HALF_EVEN); 结果为:27.68
7.3) new BigDecimal("27.6759").setScale(2, BigDecimal.ROUND_HALF_EVEN); 结果为:27.68
7.4) new BigDecimal("27.6459").setScale(2, BigDecimal.ROUND_HALF_EVEN); 结果为:27.65
7.5) new BigDecimal("27.6450").setScale(2, BigDecimal.ROUND_HALF_EVEN); 结果为:27.64
解释:
7.1) new BigDecimal("27.6749").setScale(2, BigDecimal.ROUND_HALF_EVEN); 保留2位小数,第三位数是4,根据四舍六入,所以结果为:27.67
7.2) new BigDecimal("27.6769").setScale(2, BigDecimal.ROUND_HALF_EVEN); 保留2位小数,第三位数是6,根据四舍六入,所以结果为:27.68
7.3) new BigDecimal("27.6759").setScale(2, BigDecimal.ROUND_HALF_EVEN); 保留2位小数,第三位数是5,然后看5前一位数是奇数还是偶数,
这里5前面的数是7是奇数,则遵循 BigDecimal.ROUND_HALF_UP(四舍五入),所以结果为:27.68
7.4) new BigDecimal("27.6459").setScale(2, BigDecimal.ROUND_HALF_EVEN); 保留2位小数,第三位数是5,然后看5前一位数是奇数还是偶数,
这里5前面的数是4是偶数,则遵循 BigDecimal.ROUND_HALF_DOWN,这里是保留两位小数,我们将小数点往后移动2位,移动后的结果为 2764.59,然后我们将小数点前的数值看成是0,
则结果为0.59 > 0.5, 则进位,所以结果为:27.65
7.5) new BigDecimal("27.6450").setScale(2, BigDecimal.ROUND_HALF_EVEN); 保留2位小数,第三位数是5,然后看5前一位数是奇数还是偶数,
这里5前面的数是4是偶数,则遵循 BigDecimal.ROUND_HALF_DOWN,这里是保留两位小数,我们将小数点往后移动2位,移动后的结果为 2764.50,然后我们将小数点前的数值看成是0,
则结果为0.50 不大于 0.5, 则舍弃,所以结果为:27.64
例子:
8.1) new BigDecimal("27.6759").setScale(3, BigDecimal.ROUND_UNNECESSARY); 结果为报错:Exception in thread "main" java.lang.ArithmeticException: Rounding necessary
8.2) new BigDecimal("27.6759").setScale(4, BigDecimal.ROUND_UNNECESSARY); 结果为:27.6759
8.3) new BigDecimal("27.6759").setScale(10, BigDecimal.ROUND_UNNECESSARY); 结果为:27.6759000000
解释:
8.1) new BigDecimal("27.6759").setScale(3, BigDecimal.ROUND_UNNECESSARY); 因为27.6759后面有四位小数,所以在设置保留小数位的时候必须大于或等于4,
否则抛出异常:Exception in thread "main" java.lang.ArithmeticException: Rounding necessary
8.2) new BigDecimal("27.6759").setScale(4, BigDecimal.ROUND_UNNECESSARY); 保留四位小数,不对数字进行舍入操作
8.3) new BigDecimal("27.6759").setScale(10, BigDecimal.ROUND_UNNECESSARY); 保留10位小数,如果原本的数字位数不够,则直接补零
2023-03-30 08:56:36 阅读(593)
名师出品,必属精品 https://www.91mszl.com
博主信息