RoundingMode 精度舍入策略 - HongXiaoHong/gradle-learn Wiki

学习一下 RoundingMode 精度舍入策略

RoundingMode(enum)

  • UP
  • DOWN
  • CEILING
  • FLOOR
  • HALF_UP
  • HALF_DOWN
  • HALF_EVEN
  • UNNECESSARY

UP

远离零方向舍入的舍入模式,始终对非零舍弃部分前面的数字加

PS 此舍入模式始终不会减少计算值的绝对值。

示例:

输入数字 UP
5.5 6
2.5 3
1.6 2
1.1 2
1.0 1
-1.0 -1
-1.1 -2
-1.6 -2
-2.5 -3
-5.5 -6

将输入数字舍入为一位数

DOWN

向零方向舍入的舍入模式,从不对舍弃部分前面的数字加 1(即截尾)

PS 此舍入模式始终不会增加计算值的绝对值。

示例:

输入数字 DOWN
5.5 5
2.5 2
1.6 1
1.1 1
1.0 1
-1.0 -1
-1.1 -1
-1.6 -1
-2.5 -2
-5.5 -5

CEILING

向正无限大方向舍入的舍入模式

  • 如果结果为正,则舍入行为类似于 RoundingMode.UP;
  • 如果结果为负,则舍入行为类似于 RoundingMode.DOWN。

PS 此舍入模式始终不会减少计算值

示例:

输入数字 CEILING
5.5 6
2.5 3
1.6 2
1.1 2
1.0 1
-1.0 -1
-1.1 -1
-1.6 -1
-2.5 -2
-5.5 -5

FLOOR

向负无限大方向舍入的舍入模式。

  • 如果结果为正,则舍入行为类似于 RoundingMode.DOWN
  • 如果结果为负,则舍入行为类似于 RoundingMode.UP

PS 注意,此舍入模式始终不会增加计算值。

示例:

输入数字 FLOOR
5.5 5
2.5 2
1.6 1
1.1 1
1.0 1
-1.0 -1
-1.1 -2
-1.6 -2
-2.5 -3
-5.5 -6

HALF_UP

向最接近数字方向舍入的舍入模式

  • 与两个相邻数字的距离相等,则向上舍入
  • 被舍弃部分 >= 0.5,则舍入行为同 RoundingMode.UP 否则舍入行为同 RoundingMode.DOWN

PS 注意,此舍入模式就是通常学校里讲的四舍五入。

示例:

输入数字 HALF_UP
5.5 6
2.5 3
1.6 2
1.1 1
1.0 1
-1.0 -1
-1.1 -1
-1.6 -2
-2.5 -3
-5.5 -6

HALF_DOWN

向最接近数字方向舍入的舍入模式

  • 如果与两个相邻数字的距离相等,则向下舍入
  • 如果被舍弃部分 > 0.5,则舍入行为同 RoundingMode.UP,否则舍入行为同 RoundingMode.DOWN。

示例:

输入数字 HALF_DOWN
5.5 5
2.5 2
1.6 2
1.1 1
1.0 1
-1.0 -1
-1.1 -1
-1.6 -2
-2.5 -2
-5.5 -5

HALF_EVEN

向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

  • 如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP
  • 如果为偶数,则舍入行为同 RoundingMode.HALF_DOWN

PS 注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。 此舍入模式也称为“银行家舍入法”,主要在美国使用。此舍入模式类似于 Java 中对 float 和 double 算法使用的舍入策略。

示例:

输入数字 HALF_EVEN
5.5 6
2.5 2
1.6 2
1.1 1
1.0 1
-1.0 -1
-1.1 -1
-1.6 -2
-2.5 -2
-5.5 -6

UNNECESSARY

用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入

如果对生成精确结果的操作指定此舍入模式,则抛出 ArithmeticException。 示例:

输入数字 UNNECESSARY
5.5 抛出 ArithmeticException
2.5 抛出 ArithmeticException
1.6 抛出 ArithmeticException
1.1 抛出 ArithmeticException
1.0 1
-1.0 -1
-1.1 抛出 ArithmeticException
-1.6 抛出 ArithmeticException
-2.5 抛出 ArithmeticException
-5.5 抛出 ArithmeticException

参考链接

DecimalFormat对数值格式化的舍入问题——RoundingMode