文章摘要: 提供了一些用于执行任意精度整数运算(BigInteger)和任意精度浮点数运算(BigDecimal)的类。
介绍
简要说明
- 提供了一些用于执行任意精度整数运算(BigInteger)和任意精度浮点数运算(BigDecimal)的类。
- 适用于那些需要超出标准 Java 基本数据类型(如 int、long、float、double)精度范围的计算。
主要功能
- BigInteger:用于表示不可变的任意精度的整数。可以执行所有基本的数学运算,如加、减、乘、除,以及模运算。
- BigDecimal:用于表示不可变的任意精度的浮点数。它提供了精确的数值运算,避免了二进制浮点运算中常见的精度问题。
注意事项
- 性能:BigInteger 和 BigDecimal 的操作通常比原始数据类型的操作要慢,因为它们提供了更高的精度和更大的数值范围。
- 精度:在使用 BigDecimal 进行运算时,需要注意精度和舍入模式,以避免意外的结果。
- 不可变性:BigInteger 和 BigDecimal 都是不可变的,所有的运算都会返回一个新的实例。
- 初始化:在创建 BigInteger 或 BigDecimal 实例时,应使用字符串构造器来避免由浮点数构造器引入的精度问题。
适用场景
- 高精度整数运算:当整数的大小超出了 long 类型的范围时,或者需要执行精确的整数运算时,使用 BigInteger。
- 金融计算:在金融应用程序中,经常需要精确的货币计算,BigDecimal 用于避免浮点数运算中的舍入误差。
- 科学计算:在需要非常高精度的科学计算中,BigDecimal 提供了比 double 更精确的数值表示。
- 精确的数学运算:任何需要精确数学运算的场景,例如在需要精确结果的算法中。
BigInteger
BigInteger 类用于表示不可变的任意精度的整数。它可以用于表示比 long 类型更大的整数值。
主要特性:
- 不可变性: 一旦创建了
BigInteger对象,其值就不能更改。 - 大数运算: 支持所有基本的数学运算,如加、减、乘、除等。
常用构造方法:
BigInteger(String val): 根据字符串构建BigInteger。BigInteger(byte[] val): 根据字节数组构建BigInteger。
常用方法:
add(BigInteger val): 返回两个大整数的和。subtract(BigInteger val): 返回两个大整数的差。multiply(BigInteger val): 返回两个大整数的乘积。divide(BigInteger val): 返回两个大整数的商。remainder(BigInteger val): 返回两个大整数相除的余数。gcd(BigInteger val): 返回大整数的最大公约数。modPow(BigInteger exponent, BigInteger m): 返回大整数的指数运算结果的模。modInverse(BigInteger m): 返回大整数的模逆。shiftLeft(int n): 将大整数左移 n 位。shiftRight(int n): 将大整数右移 n 位。and(BigInteger val),or(BigInteger val),xor(BigInteger val): 执行位运算。compareTo(BigInteger val): 比较两个大整数的大小。
BigDecimal
BigDecimal 类用于表示不可变的任意精度的十进制数。它常用于金融应用程序和需要高精度计算的场合。
主要特性:
- 不可变性: 与
BigInteger一样,BigDecimal也是不可变的。 - 精确十进制运算:
BigDecimal提供了精确的十进制运算。
常用构造方法:
BigDecimal(String val): 根据字符串构建BigDecimal。BigDecimal(double val): 根据双精度浮点数构建BigDecimal(不建议使用,因为double本身是不精确的)。
常用方法:
add(BigDecimal augend): 返回两个BigDecimal的和。subtract(BigDecimal subtrahend): 返回两个BigDecimal的差。multiply(BigDecimal multiplicand): 返回两个BigDecimal的乘积。divide(BigDecimal divisor, int scale, RoundingMode roundingMode): 返回两个BigDecimal的商,可以指定小数点后的位数和舍入模式。setScale(int newScale, RoundingMode roundingMode): 设置BigDecimal的小数位数,并指定舍入模式。compareTo(BigDecimal val): 比较两个BigDecimal的大小。stripTrailingZeros(): 返回一个BigDecimal,其表示去掉尾随零的数值。precision(): 返回BigDecimal的精度。setScale(int newScale): 设置BigDecimal的小数位数。
舍入模式(RoundingMode):
UP: 向远离零的方向舍入。DOWN: 向接近零的方向舍入。CEILING: 向正无穷大方向舍入。FLOOR: 向负无穷大方向舍入。HALF_UP: 四舍五入。HALF_DOWN: 五舍六入。HALF_EVEN: 向最近的偶数舍入。
学习总结
- 精度问题: 在处理金融数据和高精度计算时,应使用
BigDecimal而不是double或float。 - 构造方法: 避免使用
BigDecimal(double)构造方法,因为它可能会导致精度损失。 - 舍入模式: 根据具体需求选择合适的舍入模式。
- 性能考虑:
BigInteger和BigDecimal的运算比基本类型要慢,因此在不必要的情况下应避免使用。 - 不可变性: 由于
BigInteger和BigDecimal是不可变的,每次运算都会创建一个新的对象。 - 方法链: 可以通过方法链的方式连续调用方法,以编写更简洁的代码。