概述
一、RoundingModes说明
- 1.ROUND_UP——向上取(正数向正无穷方向,负数往负无穷方向,即远离原点方向)
- 2.ROUND_DOWN——向下取(与ROUND_UP相反)
- 3.ROUND_CEILING——永远向正无穷方向取
- 4.ROUND_FLOOR——与ROUND_CEILING相反,永远向负无穷取 -
- 5.ROUND_HALF_UP——四舍五入
- 6.ROUND_HALF_DOWN————五舍六入
- 7.ROUND_HALF_EVEN——银行家舍入,即四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。
- 8.ROUND_UNNECESSARY——无舍位,即无舍入规则(若遇到需要舍位的情况,则会抛出异常Rounding necessary)
二、RoundingModes对比
(以保留两位小数为例,对各个类型的取值做对比)
类型舍位小数 | -0.250 | -0.254 | -0.255 | -0.256 | 0.250 | 0.254 | 0.255 | 0.256 |
---|---|---|---|---|---|---|---|---|
ROUND_UP | -0.25 | -0.26 | -0.26 | -0.26 | 0.25 | 0.26 | 0.26 | 0.26 |
ROUND_DOWN | -0.25 | -0.25 | -0.25 | -0.25 | 0.25 | 0.25 | 0.25 | 0.25 |
ROUND_CEILING | -0.25 | -0.25 | -0.25 | -0.25 | 0.25 | 0.26 | 0.26 | 0.26 |
ROUND_FLOOR | -0.25 | -0.26 | -0.26 | -0.26 | 0.25 | 0.25 | 0.25 | 0.25 |
ROUND_HALF_UP | -0.25 | -0.25 | -0.26 | -0.26 | 0.25 | 0.25 | 0.26 | 0.26 |
ROUND_HALF_DOWN | -0.25 | -0.25 | -0.25 | -0.26 | 0.25 | 0.25 | 0.25 | 0.26 |
ROUND_UNNECESSARY | -0.25 | 异常 | 异常 | 异常 | 0.25 | 异常 | 异常 | 异常 |
ROUND_HALF_EVEN 类型较为特殊,另作说明如下:
- 当舍入位非五时,执行四舍六入模式。例如:0.234—>0.23,0.239—>0.24
- 当舍入位是五时,五后非零时,直接进1处理。例如:0.2251—>0.23,0.225001—>0.23。注:五后是指五后面所有的有效位,并不是五后的那一位哦
- 当舍入位是五时,五后为零,并且五前一位为 偶数 时,做舍去处理。例如:0.225—>0.22,0.24500—>0.24。这里的五前也可理解为五前面的所有有效位哦。
- 当舍入位是五时,五后为零,并且五前一位为 奇数 时,做进1处理。例如:0.235—>0.24,0.27500—>0.28
三、顺便记录一个小技巧(模运算和与运算的转换)
通过阅读BigDecimal的源码,发现在判断奇偶数时,所使用的方式为:(X & 1L)==0,
并不是之前常见的 (X%2)==0,同时进一步发现与运算的效率要比模运算高,但并不是所有的模运算都可以转换为与运算,需要满足一定的条件,故在此记录一下:
- 仅当模运算A mod B 中的除数为2的幂次方时,即B为2的n次幂时,模运算才可转为与运算,转换为:A & (B-1)。例如 a%2等价于a&1,a%8等价于a&7。原理不再赘述。
最后
以上就是火星上花生为你收集整理的Java中BigDecimal类的Rounding Modes(舍入模式)的说明和对比的全部内容,希望文章能够帮你解决Java中BigDecimal类的Rounding Modes(舍入模式)的说明和对比所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复