91名师指路-头部
91名师指路

BigDecimal八大模式详解

由于某些原因,现在不支持支付宝支付,如需要购买源码请加博主微信进行购买,微信号:13248254750


一:BigDecimal.ROUND_UP: 截断的小数 >0 时进一位,如果等于0时不做任务处理

例子:
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


二:BigDecimal.ROUND_DOWN: 直接舍弃截断的小数,不管舍弃的数值有多大,类似字符串的截取

例子:
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


三:BigDecimal.ROUND_CEILING: 如果结果为正数则舍入行为和BigDecimal.ROUND_UP相同,如果为负数,则舍入行为和BigDecimal.ROUND_DOWN相同

例子:
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


四:BigDecimal.ROUND_FLOOR:如果结果为正数则舍入行为和BigDecimal.ROUND_DOWN相同,如果为负数,则舍入行为和BigDecimal.ROUND_UP相同,和BigDecimal.ROUND_CEILING刚好是相反的

例子:
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


五:BigDecimal.ROUND_HALF_UP:四舍五入

例子:
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
解释:四舍五入,这个没什么要解释的


六:BigDecimal.ROUND_HALF_DOWN:如果舍弃的分数 > 0.5则遵循BigDecimal.ROUND_UP规则,否则遵循BigDecimal.ROUND_DOWN规则

例子:
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


七:BigDecimal.ROUND_HALF_EVEN:银行家算法,四舍六入,五看前一位是偶数则遵循 BigDecimal.ROUND_HALF_DOWN,奇数则遵循 BigDecimal.ROUND_HALF_UP(四舍五入)

例子:
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


八:BigDecimal.ROUND_UNNECESSARY:对计算的结果不进行舍入操作,但必须要设置一个精确的小数位,比如结果为27.6759有四位小数,则设置保留小数位的时候必须大于等于4,否则报错:java.lang.ArithmeticException: Rounding necessary

例子:
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

联系博主    
用户登录遮罩层
x

账号登录

91名师指路-底部