🖥️BigDecimal的四舍五入的小深究(setScale研究一)
00 分钟
2024-2-18
2024-3-28
type
status
date
slug
summary
tags
category
icon
password

前情提要

今日博主使用BigDecimal的时候,由于idea自动设置了项目jdk版本为jdk11,突然发现下述方式提示了过时
因为以前学习时,一直使用的jdk1.8,且百度都是上面的方式,便查看了一下源码

分析

从jdk11的源码上看,该方法应该是在jdk9的时候,进行了过时处理
而使用RoundingMode的代码,其实就是调用了这段过时的代码而已
所以猜测应该是jdk的开发人员想把BigDecimal中的常量类去掉,使用RoundingMode的枚举类(很符合我们的代码规范,有木有??) 那么他们的对应为
BigDecimal中
RoundingMode中
真正值
博主自己解释
ROUND_UP
UP
0
只要非零就进1
ROUND_DOWN
DOWN
1
只要非零就舍弃
ROUND_CEILING
CEILING
2
该数值大于零,则统统入1;该数值小于零,则统统舍去
ROUND_FLOOR
FLOOR
3
该数值小于零,则统统入1;该数值大于零,则统统舍去
ROUND_HALF_UP
HALF_UP
4
四舍五入
ROUND_HALF_DOWN
HALF_DOWN
5
只有大于五才会入1,等于五也舍
ROUND_HALF_EVEN
HALF_EVEN
6
银行家舍入法,见下面补充说明的详解
ROUND_UNNECESSARY
UNNECESSARY
7
见下面补充说明的详解
哈哈,是不是就是把前面的ROUND去掉了而已?看一下jdk1.8的源码,其实源码中就是很暴力
而在jdk11的源码中,改成了
本质没有变,博主是不知道这帮人打算干啥。

补充说明

既然上面说到了RoundingMode,发现上面的注释写得好啊!那就顺便粘贴一下jdk1.8中的RoundingMode枚举类的注释。

UP

远离零方向舍入的舍入模式。始终对非零舍弃部分前面的数字加 1。注意,此舍入模式始终不会减少计算值的绝对值。
Input Number
Input rounded to one digit with {@code UP} rounding
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(即截尾)。注意,此舍入模式始终不会增加计算值的绝对值。
Input Number
Input rounded to one digit with {@code DOWN} rounding
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。注意,此舍入模式始终不会减少计算值。
Input Number
Input rounded to one digit with {@code FLOOR} rounding
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

FLOOR

向负无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于 RoundingMode.DOWN;如果结果为负,则舍入行为类似于RoundingMode.UP。注意,此舍入模式始终不会增加计算值。
Input Number
Input rounded to one digit with {@code HALF_UP} rounding
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_UP

向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。如果被舍弃部分 >= 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同RoundingMode.DOWN。注意,此舍入模式就是通常学校里讲的四舍五入。
Input Number
Input rounded to one digit with {@code HALF_DOWN} rounding
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

向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。如果被舍弃部分 > 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同RoundingMode.DOWN。
Input Number
Input rounded to one digit with {@code HALF_EVEN} rounding
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

向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。此舍入模式类似于 Java 中对float 和double 算法使用的舍入策略。
Input Number
Input rounded to one digit<br/>with {@code UNNECESSARY} rounding
5.5
throw {@code ArithmeticException}
2.5
throw {@code ArithmeticException}
1.6
throw {@code ArithmeticException}
1.1
throw {@code ArithmeticException}
1.0
1
-1.0
-1
-1.1
throw {@code ArithmeticException}
-1.6
throw {@code ArithmeticException}
-2.5
throw {@code ArithmeticException}
  • ---------------------------------END---------------------------------
天行健,君子以自强不息;地势坤,君子以厚德载物