Eight rouding modes八种舍入模式解析

读《Effective Java》Item 60 : Avoid float and double if exact answers are required的时候,结尾写BigDecimal的优点时写道

Using BigDecimal has the added advantage that it gives you full control over rounding, letting you select from eight rounding modes whenever an operation that entails rounding is performed.

这里的eight rounding modes(八种舍入模式)第一次看到,查找资料记录一下

参考资料:http://www.blogjava.net/wangzc2001/archive/2010/12/17/340988.html

ROUND_UP

舍入远离零的舍入模式。
在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
即,有小数位的情况下,去掉小数位,正数+1,负数-1
Eight rouding modes八种舍入模式解析

ROUND_DOWN

接近零的舍入模式。
在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
即,有小数位的情况下,去掉小数位,整数位不变
Eight rouding modes八种舍入模式解析

ROUND_CEILING

接近正无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
如果为负,则舍入行为与 ROUND_DOWN 相同。
即,有小数位的情况下,去掉小数位,正数+1,负数不变
Eight rouding modes八种舍入模式解析

ROUND_FLOOR

接近负无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
如果为负,则舍入行为与 ROUND_UP 相同。
即,有小数位的情况下,去掉小数位,正数不变,负数-1
Eight rouding modes八种舍入模式解析

ROUND_HALF_UP

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
即,四舍五入
Eight rouding modes八种舍入模式解析

ROUND_HALF_DOWN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
即,五舍六入
Eight rouding modes八种舍入模式解析

ROUND_HALF_EVEN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
如果前一位为奇数,则入位,否则舍去。
以下例子为保留小数点1位,那么这种舍入方式下的结果。
1.15>1.2 1.25>1.2
Eight rouding modes八种舍入模式解析

ROUND_UNNECESSARY

断言请求的操作具有精确的结果,因此不需要舍入。
如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
Eight rouding modes八种舍入模式解析