6.4 BigInteger类与BigDecimal类

本文介绍了Java中的BigInteger和BigDecimal类,用于处理大整数和高精度浮点数运算。重点讲解了这两个类的定义、应用场景、构造方法、常用运算及注意事项,强调了精度管理和舍入模式在高精度计算中的重要性。

思维导图:

 

 

6.4.1 BigInteger类

定义与应用场景
  • 用途: 用于处理超出标准整型(如int或long)范围的大整数。
  • 场景: 在需要处理大数运算,如加密、大数统计等领域。
主要特点
  • 定义于java.math包中。
  • 用于表示非常大的整数,无标准数值类型限制。
构造方法
  • BigInteger(String val): 将字符串转换为BigInteger对象。
常用方法
  • add(BigInteger val): 返回两个BigInteger对象的和。
  • subtract(BigInteger val): 返回两个BigInteger对象的差。
  • multiply(BigInteger val): 返回两个BigInteger对象的乘积。
  • divide(BigInteger val): 返回两个BigInteger对象的商。
  • max(BigInteger val): 返回两个BigInteger对象中的较大值。
  • min(BigInteger val): 返回两个BigInteger对象中的较小值。
  • divideAndRemainder(BigInteger val): 返回除法的商和余数的数组。
示例应用
  • 示例(Example19.java)展示了如何创建BigInteger对象并执行基本运算。
  • 包括加法、减法、乘法、除法、比较大小和求余数等操作。
易错点
  • 将非字符串格式直接传递给BigInteger构造函数,如直接使用数字。
  • 在进行除法操作时不处理余数,特别是在精确的数学计算中。
  • 忽略BigInteger操作的性能影响,尤其在处理极大数值时。

总结

BigInteger类是处理超大整数的强大工具,尤其适用于超出标准整型范围的场景。熟练掌握其基本运算方法对于实现高效和准确的大数计算至关重要。同时,要注意合理使用以避免潜在的性能问题。

我的理解:

1. 构造方法: BigInteger(String val)

  • 用途: 将字符串表示的数值转换为BigInteger对象。
  • 使用场景: 当数值太大而无法用标准整型(如int或long)表示时。
  • 技巧: 确保传入的字符串是有效的数值字符串。
  • 错误点: 传入非数值字符串会抛出NumberFormatException

2. add(BigInteger val)

  • 用途: 求两个BigInteger对象的和。
  • 使用场景: 在进行大数加法运算时。
  • 技巧: 注意加法的结果可能超出标准整型范围。
  • 错误点: 忽略结果大小,导致内存消耗过大。

3. subtract(BigInteger val)

  • 用途: 求两个BigInteger对象的差。
  • 使用场景: 在进行大数减法运算时。
  • 技巧: 和add类似,注意结果大小。
  • 错误点: 同样是忽略结果大小的问题。

4. multiply(BigInteger val)

  • 用途: 求两个BigInteger对象的乘积。
  • 使用场景: 在进行大数乘法运算时。
  • 技巧: 乘法的结果可能远大于加法或减法,要特别注意内存消耗。
  • 错误点: 大数乘法可能导致极大的内存消耗。

5. divide(BigInteger val)

  • 用途: 求两个BigInteger对象的商。
  • 使用场景: 在进行大数除法运算时。
  • 技巧: 除以0会抛出ArithmeticException,需进行检查。
  • 错误点: 忽略除数为0的情况。

6. max(BigInteger val) & min(BigInteger val)

  • 用途: 比较两个BigInteger对象的大小。
  • 使用场景: 在需要找出最大值或最小值时。
  • 技巧: 直接使用,无需额外配置。
  • 错误点: 没有特别的易错点。

7. divideAndRemainder(BigInteger val)

  • 用途: 同时获取除法的商和余数。
  • 使用场景: 在需要除法结果和余数时。
  • 技巧: 返回的数组中,第一个元素是商,第二个元素是余数。
  • 错误点: 忽视余数的重要性,尤其在精确计算时。

总结

BigInteger类在处理超大数值时非常有用,但使用时需注意数值的有效性和内存消耗。除法操作需要特别注意除数是否为0。此外,由于BigInteger涉及的数值通常非常大,因此在性能和资源消耗方面要比标准整型操作更加谨慎。

 

6.4.2 BigDecimal类

定义与应用场景
  • 用途: 用于精确的浮点数运算。
  • 场景: 主要用于高精度计算,如金融、科学计算和技术领域,特别是在商业计算和货币值计算中。
主要特点
  • 能够表示任意精度的小数,解决了float和double类型的精度丢失问题。
构造方法和静态工厂
  • BigDecimal(String val): 通过字符串构造BigDecimal
  • static BigDecimal valueOf(double d): 通过double类型值创建BigDecimal对象。
常用方法
  • add(BigDecimal val): 返回两个BigDecimal对象的和。
  • subtract(BigDecimal val): 返回两个BigDecimal对象的差。
  • multiply(BigDecimal val): 返回两个BigDecimal对象的乘积。
  • divide(BigDecimal val): 返回两个BigDecimal对象的商。
  • max(BigDecimal val): 返回两个BigDecimal对象中的较大值。
  • min(BigDecimal val): 返回两个BigDecimal对象中的较小值。
示例应用
  • 示例(Example20.java)展示了如何创建BigDecimal对象并执行基本运算。
  • 包括加法、减法、乘法、除法和比较操作。
易错点
  • 直接使用double构造函数可能会导致精度问题,建议使用字符串或valueOf方法。
  • 在除法运算中未指定精度和舍入模式可能导致ArithmeticException
  • 对于商是无限循环小数的情况,如果不指定舍入模式,除法运算可能会抛出异常。

总结

BigDecimal类是进行高精度浮点数运算的理想选择,尤其适用于精度要求极高的场景。掌握其构造方法和常用运算方法对于实现精确的数学计算至关重要。同时,要注意在运算过程中正确处理精度和舍入模式以避免常见的错误。

 我的理解:

1. 构造方法: BigDecimal(String val) 和 valueOf(double d)

  • 用途: 创建BigDecimal实例。
  • 使用场景: 当需要高精度浮点数计算时。
  • 技巧: 推荐使用字符串构造方法以避免由于double精度限制导致的错误。
  • 错误点: 直接使用double构造函数可能会导致意外的精度问题。

2. add(BigDecimal val)

  • 用途: 求和运算。
  • 使用场景: 在进行高精度的加法运算时。
  • 技巧: 确保参与运算的所有BigDecimal对象都有适当的精度。
  • 错误点: 忽视参与加法运算的BigDecimal对象精度不一致可能导致的结果偏差。

3. subtract(BigDecimal val)

  • 用途: 求差运算。
  • 使用场景: 在进行高精度的减法运算时。
  • 技巧: 同样要注意参与运算的BigDecimal对象精度。
  • 错误点: 与add类似,忽略精度问题可能导致结果不准确。

4. multiply(BigDecimal val)

  • 用途: 乘法运算。
  • 使用场景: 在进行高精度的乘法运算时。
  • 技巧: 乘法可能导致结果精度增加,需要适当处理。
  • 错误点: 忽略结果精度,导致计算结果超出预期精度范围。

5. divide(BigDecimal val)

  • 用途: 除法运算。
  • 使用场景: 在进行高精度的除法运算时。
  • 技巧: 需要明确指定结果的精度和舍入模式,特别是当除不尽时。
  • 错误点: 在除不尽的情况下未指定舍入模式,导致ArithmeticException

6. max(BigDecimal val) & min(BigDecimal val)

  • 用途: 比较大小。
  • 使用场景: 在需要比较两个BigDecimal对象大小时。
  • 技巧: 直接使用,适用于任何精度的BigDecimal对象。
  • 错误点: 没有特别的易错点。

总结

BigDecimal类在高精度浮点数运算中非常重要,但使用时需注意精度管理和舍入模式。特别是在进行除法运算时,正确处理舍入模式和精度设定是避免常见错误的关键。此外,理解BigDecimal的运算规则对于实现精确和有效的计算是至关重要的。

 

总结:

重点
  • 精确浮点运算: BigDecimal 提供了一种在浮点数运算中保持高精度的方式,特别适用于需要精确计算的场景,如金融、商业计算。
  • 任意精度: 可以表示任意精度的小数,解决了标准浮点类型(如 float 和 double)的精度丢失问题。
  • 常用操作: 包括加法(add)、减法(subtract)、乘法(multiply)、除法(divide)以及大小比较(maxmin)。
难点
  • 精度管理: 理解如何在运算中管理精度,尤其是在乘法和除法运算中。
  • 舍入模式: 在除法运算中,正确选择和应用舍入模式,以处理无法整除的情况。
易错点
  • 构造函数使用: 错误地使用 double 构造函数而不是字符串构造函数,可能导致初始精度损失。
  • 除法精度问题: 在除法运算中未指定精度和舍入模式,导致运行时异常(ArithmeticException)。
  • 结果精度误解: 在进行连续计算时忽视了中间结果的精度可能发生变化,导致最终结果的精度不如预期。

总结

BigDecimal 是处理高精度浮点运算的强大工具,但要注意精度和舍入模式的正确管理。在使用时,应优先使用字符串构造方法以避免初始精度损失,特别注意在进行除法操作时的精度设置和舍入行为,以确保计算结果的准确性和预期一致。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值