RoundingMode
在 Java
中是一个枚举类,用来指定小数的舍位方式,共有8种
对于这些舍位方式,之前用过却理解地很模糊
最近一研究,又顿悟了!
那一瞬间,我知道该把这些理解封印在这篇博客里了
先来看一下常用的两种舍位写法,直接上代码
两种舍位写法
DecimalFormat
DecimalFormat myformat = new DecimalFormat();
myformat.setMaximumFractionDigits(2); //允许的最大小数位数,末尾的0不会显示
myformat.setGroupingSize(0); //整数部分分隔符之间的数字个数,如“123,456.78”的 groupingSize 为 3
myformat.setRoundingMode(RoundingMode.DOWN); //舍位模式
myformat.format(1.534);
BigDecimal
new BigDecimal("1.534")
.setScale(2, RoundingMode.DOWN) //小数位数(末尾的0会显示)、舍位模式
.stripTrailingZeros() //去除末尾的0
.toString();
八种舍位模式
看完了常用写法,让我们一起来认识这8种舍位模式
每种舍位介绍中带有例子,代码不上了,将直接展示结果
例子中的小数都保留到小数点后两位
UP
正数向上舍位,负数向下舍位
例子
1.530 --> 1.53
1.534 --> 1.54
1.538 --> 1.54
-1.534 --> -1.54
DOWN
舍位时向 0 靠近,即直接舍掉小数点后3位至末尾的数字
例子
1.530 --> 1.53
1.534 --> 1.53
1.538 --> 1.53
-1.534 --> -1.53
CEILING(天花板)
正数如 UP,负数如 DOWN
例子
1.530 --> 1.53
1.534 --> 1.54
1.538 --> 1.54
-1.538 --> -1.53
FLOOR(地板)
正数如 DOWN,负数如 UP
例子
1.530 --> 1.53
1.534 --> 1.53
1.538 --> 1.53
-1.538 --> -1.54
上面介绍的4种舍位模式比较粗暴,用“一刀切”的方式将数字 1-9 UP
或者 DOWN
(为什么脑海中浮现出了深蹲的画面。。)
接下来要介绍的3种 HALF
舍位模式,就比较“人性化”了,类似于我们接触过的“四舍五入”舍位模式
而这个 HALF
可以简单地理解为数字 5,三种 HALF
方式的不同点也就在数字 5 的舍位模式
HALF_UP
5 UP,其他数字四舍五入,即常见的四舍五入
例子
1.530 --> 1.53
1.534 --> 1.53
1.535 --> 1.54
1.538 --> 1.54
-1.534 --> -1.53
-1.535 --> -1.54
这种模式逢5就入,使结果偏向大数
HALF_DOWN
5 DOWN,其他数字四舍五入,即五舍六入
例子
1.534 --> 1.53
1.535 --> 1.53
1.538 --> 1.54
-1.534 --> -1.53
-1.535 --> -1.53
-1.538 --> -1.54
HALF_EVEN
even
有偶数的意思
5 后面有数字且这些数字不全是0,进1
否则再看 5 的前一位,奇进偶不进
其他数字四舍五入
也叫四舍六入五成双
例子
9.8249 --> 9.82
9.82671 --> 9.83
9.8350 --> 9.84 //3为奇数进1
9.8351 --> 9.84 //5后有不为0的数字进1
9.8250 --> 9.82 //5后数字为0且2为偶数,不进
9.82501 --> 9.83 //5后有不为0的数字进1
1.524 --> 1.52
1.525 --> 1.52 //因为2是偶数,所以不进位
1.526 --> 1.53
1.195 --> 1.2 //因为9是奇数,所以进1
这种模式使结果有的变小,有的变大,从统计学上来说更加科学
UNNECESSARY
不需要指定舍位模式
这种情况是指定位数后没有数字或数字全是0
否则抛出异常
例子
1.53 --> 1.53
1.530 --> 1.53
1.53000 --> 1.53
1.531 --> ArithmeticException
1.5324 --> ArithmeticException