1、简介:
BigDecimal
是 Java 中的一个高精度数字处理类,用于对任意长度的数值进行精确计算。在 Java 中,基本数据类型 int
、long
、float
和 double
都有其精度限制。例如,double
类型可以存储 15 位有效数字,但是当需要处理更多位有效数字时,就会出现计算精度损失的问题。为了避免这种计算精度损失,Java 提供了 BigDecimal
类来进行高精度计算。BigDecimal
类中的数值可以无限制扩展到任意位数,因此可以保持较高的计算精度。 通过使用 BigDecimal
类,可以避免在浮点数计算中出现的舍入误差以及其他精度问题,并能够执行任何基本算术运算、取模和比较操作。
2、BigDecimal
类提供了以下常用的基本算术运算方法:
add(BigDecimal augend)
:加法操作,返回当前BigDecimal
对象加上参数augend
后的结果。subtract(BigDecimal subtrahend)
:减法操作,返回当前BigDecimal
对象减去参数subtrahend
后的结果。multiply(BigDecimal multiplicand)
:乘法操作,返回当前BigDecimal
对象乘以参数multiplicand
后的结果。divide(BigDecimal divisor)
:除法操作,返回当前BigDecimal
对象除以参数divisor
后的结果。remainder(BigDecimal divisor)
:取模操作,返回当前BigDecimal
对象模以参数divisor
后的余数。
这些方法都会返回一个新的 BigDecimal
对象作为计算结果,并不会改变调用方法的对象本身。此外,这些方法都有对应的重载版本,可以接受一个 MathContext
参数来控制计算的精度和舍入方式。
示例代码:
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("5");
BigDecimal sum = a.add(b);
BigDecimal difference = a.subtract(b);
BigDecimal product = a.multiply(b);
BigDecimal quotient = a.divide(b); // 抛出异常,因为除不尽
BigDecimal remainder = a.remainder(b);
System.out.println("a + b = " + sum.toString()); // 输出 15
System.out.println("a - b = " + difference.toString()); // 输出 5
System.out.println("a * b = " + product.toString()); // 输出 50
System.out.println("a / b = " + quotient.toString()); // 抛出异常
System.out.println("a % b = " + remainder.toString()); // 输出 0
在上面的例子中,我们首先定义了两个 BigDecimal
对象 a
和 b
,分别代表被操作数和操作数。然后我们使用 add()
、subtract()
、multiply()
、divide()
和 remainder()
方法对它们进行加减乘除运算,并将结果转换为字符串类型,输出到控制台。注意,在除法运算中,如果除不尽会抛出异常。
3、BigDecimal
提供了多个方法来进行四舍五入和向上取整的操作,其中常用的包括:
setScale(int newScale, RoundingMode roundingMode)
:用于设置当前BigDecimal
对象的小数位数,并指定舍入方式。其中newScale
为小数位数,roundingMode
为舍入方式。setScale(int newScale)
:用于设置当前BigDecimal
对象的小数位数,默认使用RoundingMode.HALF_UP
舍入方式。*(如果不存在模式则默认是断言模式舍入模式判断是否具有精确结果,如不精确会有异常此处存在疑议)round(MathContext mc)
:用于对当前BigDecimal
对象进行舍入操作,并返回一个新的BigDecimal
对象作为结果。其中mc
参数提供了精度和舍入模式的控制。
示例代码:
// 四舍五入保留2位小数,使用 HALF_UP 舍入方式
BigDecimal a = new BigDecimal("1.2345678");
BigDecimal b = a.setScale(2, RoundingMode.HALF_UP);
System.out.println(b); // 输出 1.23
// 向上取整保留3位小数,使用 CEILING 舍入方式
BigDecimal c = new BigDecimal("1.2345678");
BigDecimal d = c.setScale(3, RoundingMode.CEILING);
System.out.println(d); // 输出 1.235
// 四舍五入保留4位小数,使用 ROUND_HALF_EVEN 舍入方式
BigDecimal e = new BigDecimal("1.2345678");
BigDecimal f = e.round(new MathContext(4, RoundingMode.HALF_EVEN));
System.out.println(f); // 输出 1.2346
在上面的例子中,我们分别使用了 setScale()
和 round()
方法对 BigDecimal
对象进行了相应的舍入操作,并在控制台输出了结果。需要注意的是,在进行四舍五入或向上取整时,要根据实际需求选择合适的舍入方式以及小数位数。
4、在 Java 中,RoundingMode
枚举类型定义了一些常用的舍入模式,可以用于对数字进行舍入。以下是 RoundingMode
枚举类型中定义的几种常见舍入模式:
HALF_UP
:四舍五入,当小数部分大于等于 0.5 时向上舍入。HALF_DOWN
:五舍六入,当小数部分大于 0.5 时向上舍入,否则向下舍入。HALF_EVEN
:银行家舍入法,当小数部分为 0.5 时,向最接近的偶数舍入。UP
:向远离零的方向舍入,即向正无穷大方向舍入。DOWN
:向零的方向舍入,即向负无穷大方向舍入。CEILING
:向正无穷大方向舍入,即不小于原数的最小整数。FLOOR
:向负无穷大方向舍入,即不大于原数的最大整数。UNNECESSARY
:不进行舍入,如果需要舍入则抛出异常。
使用这些不同的舍入模式可以根据具体的需求对数字进行精确的舍入操作。在实际应用中,根据舍入规则的不同选择适合的舍入模式可以确保计算结果的准确性和符合预期的规则。