❤️ 个人主页:水滴技术
🌸 订阅专栏:Java 教程:从入门到精通
🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬
大家好,我是水滴~~
本文主要对 BigDecimal 类进行详细介绍,主要内容有:构造器、静态方法、静态常量、常用方法、舍入模式,并提供了大量的代码示例,可以将该文章当成工具书来用。
一、构造器
通过构造器获取 BigDecimal 的实例, 传入值共分为四大类:字符数组、字符串、数字、BigInteger 对象。
1.1 传入字符数组
通过传入字符数组的构造器有四个,要求所有字符都是数字:
-
BigDecimal(char[] in)
:传入字符数组 -
BigDecimal(char[] in, int offset, int len)
:传入字符数组、偏移量、长度 -
BigDecimal(char[] in, MathContext mc)
:传入字符数组,并指定精度和舍入模式 -
BigDecimal(char[] in, int offset, int len, MathContext mc)
:传入字符数组、偏移量、长度,并指定精度和舍入模式
代码示例:
// 字符数组
char[] in = "123.456".toCharArray();
// 传入字符数组
BigDecimal bd1 = new BigDecimal(in);
System.out.println("bd1 --> " + bd1);
// 传入字符数组、偏移量、长度
BigDecimal bd2 = new BigDecimal(in, 2, 4);
System.out.println("bd2 --> " + bd2);
// 传入字符数组,并指定精度和舍入模式
BigDecimal bd3 = new BigDecimal(in, new MathContext(5, RoundingMode.HALF_UP));
System.out.println("bd3 --> " + bd3);
// 传入字符数组、偏移量、长度,并指定精度和舍入模式
BigDecimal bd4 = new BigDecimal(in, 2, 4, new MathContext(2, RoundingMode.HALF_UP));
System.out.println("bd4 --> " + bd4);
输出结果:
bd1 --> 123.456
bd2 --> 3.45
bd3 --> 123.46
bd4 --> 3.5
1.2 传入字符串
通过传入字符串的构造器有两个,要求字符串是个数字:
-
BigDecimal(String val)
:传入字符串 -
BigDecimal(String val, MathContext mc)
:传入字符串,并指定精度和舍入模式
代码示例:
// 字符串
String val = "123.456";
// 传入字符串
BigDecimal bd1 = new BigDecimal(val);
System.out.println("bd1 --> " + bd1);
// 传入字符串,并指定精度和舍入模式
BigDecimal bd2 = new BigDecimal(val, new MathContext(5, RoundingMode.HALF_UP));
System.out.println("bd2 --> " + bd2);
输出结果:
bd1 --> 123.456
bd2 --> 123.46
1.3 传入数字
通过传入数字类型的构造器有六个,其中 int、long、double 各两个:
-
BigDecimal(int val)
:传入 int 类型 -
BigDecimal(int val, MathContext mc)
:传入 int 类型,并指定精度和舍入模式 -
BigDecimal(long val)
:传入 long 类型 -
BigDecimal(long val, MathContext mc)
:传入 long 类型,并指定精度和舍入模式 -
BigDecimal(double val)
:传入 double 类型(存在精度问题,不推荐使用) -
BigDecimal(double val, MathContext mc)
:传入 double 类型,并指定精度和舍入模式(存在精度问题,不推荐使用)
代码示例:
// 传入 int 类型
BigDecimal bd1 = new BigDecimal(123456);
System.out.println("bd1 --> " + bd1);
// 传入 int 类型,并指定精度和舍入模式
BigDecimal bd2 = new BigDecimal(123456, new MathContext(5));
System.out.println("bd2 --> " + bd2);
// 传入 long 类型
BigDecimal bd3 = new BigDecimal(123456L);
System.out.println("bd3 --> " + bd3);
// 传入 long 类型,并指定精度和舍入模式
BigDecimal bd4 = new BigDecimal(123456L, new MathContext(5));
System.out.println("bd4 --> " + bd4);
// 传入 double 类型(存在精度问题,不推荐使用)
BigDecimal bd5 = new BigDecimal(123.456);
System.out.println("bd5 --> " + bd5);
// 传入 double 类型,并指定精度和舍入模式(存在精度问题,不推荐使用)
BigDecimal bd6 = new BigDecimal(123.456, new MathContext(5));
System.out.println("bd6 --> " + bd6);
输出结果:
bd1 --> 123456
bd2 --> 1.2346E+5
bd3 --> 123456
bd4 --> 1.2346E+5
bd5 --> 123.4560000000000030695446184836328029632568359375
bd6 --> 123.46
1.4 传入 BigInteger 对象
通过传入 BigInteger 对象的构造器有四个:
-
BigDecimal(BigInteger val)
:传入 BigInteger 对象 -
BigDecimal(BigInteger val, MathContext mc)
:传入 BigInteger 对象,并指定精度和舍入模式 -
BigDecimal(BigInteger unscaledVal, int scale)
:传入 BigInteger 对象,并进入缩放 -
BigDecimal(BigInteger unscaledVal, int scale, MathContext mc)
:传入 BigInteger 对象,并进入缩放,并指定精度和舍入模式
代码示例:
// BigInteger 对象
BigInteger val = BigInteger.valueOf(123456);
// 传入 BigInteger 对象
BigDecimal bd1 = new BigDecimal(val);
System.out.println("bd1 --> " + bd1);
// 传入 BigInteger 对象,并指定精度和舍入模式
BigDecimal bd2 = new BigDecimal(val, new MathContext(5));
System.out.println("bd2 --> " + bd2);
// 传入 BigInteger 对象,并进行缩放
BigDecimal bd3 = new BigDecimal(val, 3);
System.out.println("bd3 --> " + bd3);
// 传入 BigInteger 对象,并进行缩放,并指定精度和舍入模式
BigDecimal bd4 = new BigDecimal(val, 3, new MathContext(5));
System.out.println("bd4 --> " + bd4);
输出结果:
bd1 --> 123456
bd2 --> 1.2346E+5
bd3 --> 123.456
bd4 --> 123.46
二、静态方法
BigDecimal 提供了三个静态方法 valueOf()
,传入数字即可获取 BigDecimal 实例:
-
BigDecimal valueOf(long val)
:静态方法,传入 long 类型 -
BigDecimal valueOf(long unscaledVal, int scale)
:静态方法,传入 long 类型,并且进行缩放 -
BigDecimal valueOf(double val)
:静态方法,传入 double 类型(会将传入值转为字符串,没有精度问题)
代码示例:
// 静态方法,传入 long 类型
BigDecimal bd1 = BigDecimal.valueOf(123456);
System.out.println("bd1 --> " + bd1);
// 静态方法,传入 long 类型,并且进行缩放
BigDecimal bd2 = BigDecimal.valueOf(123456, 3);
System.out.println("bd2 --> " + bd2);
// 静态方法,传入 double 类型(会将传入值转为字符串,没有精度问题)
BigDecimal bd3 = BigDecimal.valueOf(123.456);
System.out.println("bd3 --> " + bd3);
输出结果:
bd1 --> 123456
bd2 --> 123.456
bd3 --> 123.456
三、静态常量
BigDecimal 提供了三个静态常量,用于获取“零”的实例、“一”的实例、“十”的实例:
-
BigDecimal.ZERO
:“零”的静态常量 -
BigDecimal.ONE
:“一”的静态常量 -
BigDecimal.TEN
:“十”的静态常量
代码示例:
// “零”的静态常量
BigDecimal bd1 = BigDecimal.ZERO;
System.out.println("bd1 --> " + bd1);
// “一”的静态常量
BigDecimal bd2 = BigDecimal.ONE;
System.out.println("bd2 --> " + bd2);
// “十”的静态常量
BigDecimal bd3 = BigDecimal.TEN;
System.out.println("bd3 --> " + bd3);
输出结果:
bd1 --> 0
bd2 --> 1
bd3 --> 10
四、常用方法
4.1 加法(add)
加法运算是由两个 BigDecimal 对象进行相加,返回结果也是一个 BigDecimal 对象。加法运算共有两个重载方法可使用:
-
BigDecimal add(BigDecimal augend)
:加法运算 -
BigDecimal add(BigDecimal augend, MathContext mc)
:加法运算,并指定精度和舍入模式
代码示例:
// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("56.78");
BigDecimal val2 = new BigDecimal("12.34");
// 加法运算
BigDecimal bd1 = val1.add(val2);
System.out.println(val1 + " + " + val2 + " = " + bd1);
// 加法运算,,并指定精度和舍入模式
BigDecimal bd2 = val1.add(val2, new MathContext(3, RoundingMode.HALF_UP));
System.out.println(val1 + " + " + val2 + " = " + bd2);
输出结果:
56.78 + 12.34 = 69.12
56.78 + 12.34 = 69.1
4.2 减法(subtract)
减法运算是由两个 BigDecimal 对象进行相减,返回结果也是一个 BigDecimal 对象。减法运算共有两个重载方法可使用:
-
BigDecimal subtract(BigDecimal subtrahend)
:减法运算 -
BigDecimal subtract(BigDecimal subtrahend, MathContext mc)
:减法运算,并指定精度和舍入模式
代码示例:
// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("56.78");
BigDecimal val2 = new BigDecimal("12.34");
// 减法运算
BigDecimal bd1 = val1.subtract(val2);
System.out.println(val1 + " - " + val2 + " = " + bd1);
// 减法运算,,并指定精度和舍入模式
BigDecimal bd2 = val1.subtract(val2, new MathContext(3, RoundingMode.HALF_UP));
System.out.println(val1 + " - " + val2 + " = " + bd2);
输出结果:
56.78 - 12.34 = 44.44
56.78 - 12.34 = 44.4
4.3 乘法(multiply)
乘法运算是由两个 BigDecimal
对象进行相乘,返回结果也是一个 BigDecimal
对象。乘法运算共有两个重载方法可使用:
-
BigDecimal multiply(BigDecimal multiplicand)
:乘法运算 -
BigDecimal multiply(BigDecimal multiplicand, MathContext mc)
:乘法运算,并指定精度和舍入模式
代码示例:
// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("56.78");
BigDecimal val2 = new BigDecimal("12.34");
// 乘法运算
BigDecimal bd1 = val1.multiply(val2);
System.out.println(val1 + " * " + val2 + " = " + bd1);
// 乘法运算,并指定精度和舍入模式
BigDecimal bd2 = val1.multiply(val2, new MathContext(4, RoundingMode.HALF_UP));
System.out.println(val1 + " * " + val2 + " = " + bd2);
输出结果:
56.78 * 12.34 = 700.6652
56.78 * 12.34 = 700.7
4.4 除法(divide)
除法运算是由两个 BigDecimal
对象进行相除,返回结果也是一个 BigDecimal
对象。除法相对比较特殊,由于可能存在除不尽的情况,有些方法会抛出 ArithmeticException
异常,这个在介绍具体方法时会指明。
除法运算共有六个重载方法,其中两个方法在 Java 9 的时候被废弃,我们这里只介绍剩余四个:
-
BigDecimal divide(BigDecimal divisor)
:除法运算(未处理除不尽的情况,会报 ArithmeticException 异常,不推荐使用) -
BigDecimal divide(BigDecimal divisor, MathContext mc)
:除法运算,并指定精度和舍入模式 -
BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)
:除法运算,并指定舍入模式 -
BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
:除法运算,并指定保留的小数位数和舍入模式
代码示例:
// 构造三个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("12.34");
BigDecimal val2 = new BigDecimal("2");
BigDecimal val3 = new BigDecimal("3");
// 除法运算(未处理除不尽的情况,会报 ArithmeticException 异常,不推荐使用)
BigDecimal bd1 = val1.divide(val2);
System.out.println(val1 + " / " + val2 + " = " + bd1);
// 除法运算,并指定精度和舍入模式
BigDecimal bd2 = val1.divide(val3, new MathContext(4, RoundingMode.HALF_UP));
System.out.println(val1 + " / " + val3 + " = " + bd2);
// 除法运算,并指定舍入模式
BigDecimal bd3 = val1.divide(val3, RoundingMode.HALF_UP);
System.out.println(val1 + " / " + val3 + " = " + bd3);
// 除法运算,并指定保留的小数位数和舍入模式
BigDecimal bd4 = val1.divide(val3, 4, RoundingMode.HALF_UP);
System.out.println(val1 + " / " + val3 + " = " + bd4);
输出结果:
12.34 / 2 = 6.17
12.34 / 3 = 4.113
12.34 / 3 = 4.11
12.34 / 3 = 4.1133
4.5 商的整数和余数
4.5.1 取整
divideToIntegralValue
方法是将两个 BigDecimal
对象相除后,获取整数部分,其共有两个重载方法:
-
BigDecimal divideToIntegralValue(BigDecimal divisor)
:取整 -
BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc)
:取整,并指定精度(精度不够会抛出ArithmeticException
异常)
代码示例:
// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1234.5678");
BigDecimal val2 = new BigDecimal("3");
// 取整
BigDecimal bd1 = val1.divideToIntegralValue(val2);
System.out.println("[" + val1 + " / " + val2 + "] = " + bd1);
// 取整,并指定精度
BigDecimal bd2 = val1.divideToIntegralValue(val2, new MathContext(4));
System.out.println("[" + val1 + " / " + val2 + "] = " + bd2);
输出结果:
[1234.5678 / 3] = 411.0000
[1234.5678 / 3] = 411.0
4.5.2 取余
remainder
方法是将两个 BigDecimal
对象相除后,取其余数,其共有两个重载方法:
-
BigDecimal remainder(BigDecimal divisor)
:取余 -
BigDecimal remainder(BigDecimal divisor, MathContext mc)
:取余,并指定精度(精度不够会抛出ArithmeticException
异常)
代码示例:
// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1234.5678");
BigDecimal val2 = new BigDecimal("3");
// 取余
BigDecimal bd1 = val1.remainder(val2);
System.out.println(val1 + " % " + val2 + " = " + bd1);
// 取余,并指定精度
BigDecimal bd2 = val1.remainder(val2, new MathContext(3));
System.out.println(val1 + " % " + val2 + " = " + bd2);
输出结果:
1234.5678 % 3 = 1.5678
1234.5678 % 3 = 1.5678
4.5.3 同时取整和取余
divideAndRemainder
方法可以同时取两个 BigDecimal
对象相除后的整数部分和余数。如果同时需要整商和余数,这种方法比分开使用取整和取余的方法更快,因为除尘只需要执行一次。
其共有两个重载方法:
代码示例:
// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1234.5678");
BigDecimal val2 = new BigDecimal("3");
// 同时取商的整数和余数
BigDecimal[] bd1 = val1.divideAndRemainder(val2);
System.out.println("[" + val1 + " / " + val2 + "] = " + bd1[0]);
System.out.println(" " + val1 + " % " + val2 + " = " + bd1[1]);
// 同时取商的整数和余数,并指定精度
BigDecimal[] bd2 = val1.divideAndRemainder(val2, new MathContext(3));
System.out.println("[" + val1 + " / " + val2 + "] = " + bd2[0]);
System.out.println(" " + val1 + " % " + val2 + " = " + bd2[1]);
输出结果:
[1234.5678 / 3] = 411.0000
1234.5678 % 3 = 1.5678
[1234.5678 / 3] = 411.000
1234.5678 % 3 = 1.5678
4.6 幂运算
通过 pow
方法可以做幂运算。
代码示例:
// 构造 BigDecimal 对象
BigDecimal val = new BigDecimal("2");
// 幂运算
BigDecimal bd1 = val.pow(10);
System.out.println("bd1 --> " + bd1);
// 幂运算,并指定精度
BigDecimal bd2 = val.pow(10, new MathContext(4));
System.out.println("bd2 --> " + bd2);
输出结果:
bd1 --> 1024
bd2 --> 1024
4.7 绝对值
通过 abs
方法获取绝对值。
代码示例:
// 构造 BigDecimal 对象
BigDecimal val = new BigDecimal("-1024");
// 取绝对值
BigDecimal bd1 = val.abs();
System.out.println("bd1 --> " + bd1);
// 取绝对值,并指定精度
BigDecimal bd2 = val.abs(new MathContext(4));
System.out.println("bd2 --> " + bd2);
输出结果:
bd1 --> 1024
bd2 --> 1024
4.8 取反(负号)
通过 negate
方法可以对数进行取反,相当于 -this
代码示例:
// 构造 BigDecimal 对象
BigDecimal val = new BigDecimal("1024");
// 取反
BigDecimal bd1 = val.negate();
System.out.println("bd1 --> " + bd1);
// 取反,并指定精度
BigDecimal bd2 = val.negate(new MathContext(4));
System.out.println("bd2 --> " + bd2);
输出结果:
bd1 --> -1024
bd2 --> -1024
4.9 正号
通过 plus
做正号处理,等于本身,相当于 +this
。
代码示例:
// 构造 BigDecimal 对象
BigDecimal val = new BigDecimal("-1024");
// 取正
BigDecimal bd1 = val.plus();
System.out.println("bd1 --> " + bd1);
// 取正,并指定精度
BigDecimal bd2 = val.plus(new MathContext(4));
System.out.println("bd2 --> " + bd2);
输出结果:
bd1 --> -1024
bd2 --> -1024
4.10 符号
通过 signum
获取该数的符号:正数为 1
;零为 0
;负数为 -1
代码示例:
// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("10");
BigDecimal val2 = new BigDecimal("0");
BigDecimal val3 = new BigDecimal("-11");
// 符号函数,获取该数的正负号
System.out.println("bd1 --> " + val1.signum());
System.out.println("bd2 --> " + val2.signum());
System.out.println("bd3 --> " + val3.signum());
输出结果:
bd1 --> 1
bd2 --> 0
bd3 --> -1
4.11 移位
可以对数值进行小数点移位,左移位使用 movePointLeft
方法,右移位使用 movePointRight
方法。
代码示例:
// 构造 BigDecimal 对象
BigDecimal val = new BigDecimal("1234.5678");
// 小数点左移位
BigDecimal bd1 = val.movePointLeft(2);
System.out.println("bd1 --> " + bd1);
// 小数点右移位
BigDecimal bd2 = val.movePointRight(2);
System.out.println("bd2 --> " + bd2);
输出结果:
bd1 --> 12.345678
bd2 --> 123456.78
4.12 最大值和最小值
可以获取两个数的最大值和最小值,最大值使用 max
方法,最小值使用 min
方法。
代码示例:
// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1024");
BigDecimal val2 = new BigDecimal("2048");
// 取最小值
BigDecimal bd1 = val1.min(val2);
System.out.println("min --> " + bd1);
// 取最大值
BigDecimal bd2 = val1.max(val2);
System.out.println("max --> " + bd2);
输出结果:
min --> 1024
max --> 2048
4.13 转换方法
-
long longValue()
:转换为long
值 -
int intValue()
:转换为int
值 -
float floatValue()
:转换为float
值 -
double doubleValue()
:转换为double
值 -
BigInteger toBigInteger()
:转换为BigInteger
对象 -
toString
:转为String
字符串,有必要时使用科学计数法 -
toEngineeringString
:转为String
字符串,有必要时使用工程计数法 -
toPlainString
:转为String
字符串,不使用任何计数法
五、舍入模式
BigDecimal 可以通过 setScale()
或 round()
方法来单独设置精度和舍入模式,不同的舍入模式返回的结果也会不同。我们在制定算法时,要先确定舍入模式。
舍入模式共有八种,可以从 RoundingMode
中查看,内容如下:
5.1 UP
从零舍入。只要检测到“废弃数”为非零,就往前入一。
代码示例:
// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");
// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.UP));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.UP));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.UP));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.UP));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.UP));
System.out.println(val6 + "\t\t" + val6.setScale(0, RoundingMode.UP));
System.out.println(val7 + "\t\t" + val7.setScale(0, RoundingMode.UP));
System.out.println(val8 + "\t\t" + val8.setScale(0, RoundingMode.UP));
System.out.println(val9 + "\t\t" + val9.setScale(0, RoundingMode.UP));
输出结果:
1.9 2
1.5 2
1.4 2
1.1 2
1.0 1
-1.0 -1
-1.4 -2
-1.5 -2
-1.9 -2
5.2 DOWN
舍入到零。永远舍掉“废弃数”,相当于截断。
代码示例:
// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");
// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.DOWN));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.DOWN));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.DOWN));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.DOWN));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.DOWN));
System.out.println(val6 + "\t\t" + val6.setScale(0, RoundingMode.DOWN));
System.out.println(val7 + "\t\t" + val7.setScale(0, RoundingMode.DOWN));
System.out.println(val8 + "\t\t" + val8.setScale(0, RoundingMode.DOWN));
System.out.println(val9 + "\t\t" + val9.setScale(0, RoundingMode.DOWN));
输出结果:
1.9 1
1.5 1
1.4 1
1.1 1
1.0 1
-1.0 -1
-1.4 -1
-1.5 -1
-1.9 -1
5.3 CEILING
向正无穷舍入。如果结果为正数,则表现为 RoundingMode.UP
;如果为负数,则表现为 RoundingMode.DOWN
。
代码示例:
// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");
// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.CEILING));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.CEILING));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.CEILING));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.CEILING));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.CEILING));
System.out.println(val6 + "\t\t" + val6.setScale(0, RoundingMode.CEILING));
System.out.println(val7 + "\t\t" + val7.setScale(0, RoundingMode.CEILING));
System.out.println(val8 + "\t\t" + val8.setScale(0, RoundingMode.CEILING));
System.out.println(val9 + "\t\t" + val9.setScale(0, RoundingMode.CEILING));
输出结果:
1.9 2
1.5 2
1.4 2
1.1 2
1.0 1
-1.0 -1
-1.4 -1
-1.5 -1
-1.9 -1
5.4 FLOOR
向负无穷舍入。如果结果为正数,则表现为 RoundingMode.DOWN
;如果为负数,则表现为 RoundingMode.UP
。
代码示例:
// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");
// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.FLOOR));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.FLOOR));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.FLOOR));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.FLOOR));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.FLOOR));
System.out.println(val6 + "\t\t" + val6.setScale(0, RoundingMode.FLOOR));
System.out.println(val7 + "\t\t" + val7.setScale(0, RoundingMode.FLOOR));
System.out.println(val8 + "\t\t" + val8.setScale(0, RoundingMode.FLOOR));
System.out.println(val9 + "\t\t" + val9.setScale(0, RoundingMode.FLOOR));
输出结果:
1.9 1
1.5 1
1.4 1
1.1 1
1.0 1
-1.0 -1
-1.4 -2
-1.5 -2
-1.9 -2
5.5 HALF_UP
向“最接近的”数字舍入,也是我们通常说的“四舍五入”。
代码示例:
// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");
// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.HALF_UP));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.HALF_UP));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.HALF_UP));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.HALF_UP));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.HALF_UP));
System.out.println(val6 + "\t\t" + val6.setScale(0, RoundingMode.HALF_UP));
System.out.println(val7 + "\t\t" + val7.setScale(0, RoundingMode.HALF_UP));
System.out.println(val8 + "\t\t" + val8.setScale(0, RoundingMode.HALF_UP));
System.out.println(val9 + "\t\t" + val9.setScale(0, RoundingMode.HALF_UP));
输出结果:
1.9 2
1.5 2
1.4 1
1.1 1
1.0 1
-1.0 -1
-1.4 -1
-1.5 -2
-1.9 -2
5.6 HALF_DOWN
向“最邻近”的数字舍入,也就是“五舍六入”
代码示例:
// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");
// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val6 + "\t\t" + val6.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val7 + "\t\t" + val7.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val8 + "\t\t" + val8.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val9 + "\t\t" + val9.setScale(0, RoundingMode.HALF_DOWN));
输出结果:
1.9 2
1.5 1
1.4 1
1.1 1
1.0 1
-1.0 -1
-1.4 -1
-1.5 -1
-1.9 -2
5.7 HALF_EVEN
该舍入模式分两种情况:如果“废弃数”左边的数字为奇数,则与 HALF_UP
相同;如果为偶数,则与 HALF_DOWN
相同。
“废弃数”左边的数字为奇数,代码示例:
// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.9");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.9");
// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val6 + "\t\t" + val6.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val7 + "\t\t" + val7.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val8 + "\t\t" + val8.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val9 + "\t\t" + val9.setScale(0, RoundingMode.HALF_EVEN));
输出结果:
1.9 2
1.5 2
1.4 1
1.1 1
1.0 1
-1.0 -1
-1.4 -1
-1.5 -2
-1.9 -2
“废弃数”左边的数字为偶数,代码示例:
// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("2.6");
BigDecimal val2 = new BigDecimal("2.5");
BigDecimal val3 = new BigDecimal("2.4");
BigDecimal val4 = new BigDecimal("2.1");
BigDecimal val5 = new BigDecimal("2.0");
BigDecimal val6 = new BigDecimal("-2.0");
BigDecimal val7 = new BigDecimal("-2.4");
BigDecimal val8 = new BigDecimal("-2.5");
BigDecimal val9 = new BigDecimal("-2.6");
// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val6 + "\t\t" + val6.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val7 + "\t\t" + val7.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val8 + "\t\t" + val8.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val9 + "\t\t" + val9.setScale(0, RoundingMode.HALF_EVEN));
输出结果:
2.6 3
2.5 2
2.4 2
2.1 2
2.0 2
-2.0 -2
-2.4 -2
-2.5 -2
-2.6 -3
5.8 UNNECESSARY
断言所请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定了此舍入模式,则会抛出 ArithmeticException
异常。
热门专栏
👍 《Python入门核心技术》
👍 《IDEA 教程:从入门到精通》
👍 《Java 教程:从入门到精通》
👍 《MySQL 教程:从入门到精通》
👍 《大数据核心技术从入门到精通》文章来源:https://www.toymoban.com/news/detail-401462.html
文章来源地址https://www.toymoban.com/news/detail-401462.html
到了这里,关于Java 数学计算(一):BigDecimal 详解 + 代码示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!