java BigDecimal 常用用法

1. 创建 BigDecimal 实例

  • 从字符串创建:推荐使用字符串创建 BigDecimal 实例,因为这样可以精确控制数值,避免精度丢失。
BigDecimal bd = new BigDecimal("123.456");
  • 从 double 创建:虽然可以从 double 创建,但不建议这样做,因为 double 本身可能就不精确。
BigDecimal bd = new BigDecimal(123.456); // 可能会因为double的精度问题导致不精确

2. 加减乘除

  • 加法
BigDecimal bd1 = new BigDecimal("10.00");  
BigDecimal bd2 = new BigDecimal("5.00");  
BigDecimal sum = bd1.add(bd2); // 结果为 15.00
  • 减法
BigDecimal difference = bd1.subtract(bd2); // 结果为 5.00
  • 乘法
BigDecimal bd3 = new BigDecimal("2.00");  
BigDecimal product = bd1.multiply(bd3); // 结果为 20.00
  • 除法
    • 精确除法(保留小数位数):
BigDecimal quotient = bd1.divide(bd2, 2, RoundingMode.HALF_UP); // 结果为 2.00,保留两位小数,四舍五入
  • 注意 :除法时如果不指定精度和舍入模式,可能会抛出 ArithmeticException 异常。

3. 精度和舍入模式

  • 在进行除法、平方根等运算时,需要指定精度和舍入模式以避免异常。
  • 舍入模式(RoundingMode):HALF_UP(四舍五入)、DOWN(向下舍入)、UP(向上舍入)、HALF_DOWN(五舍六入)、CEILING(向正无穷方向舍入)、FLOOR(向负无穷方向舍入)等。

4. 比较

由于 BigDecimal 是不可变的,因此比较大小使用 compareTo 方法,而不是 ==

int result = bd1.compareTo(bd2);  
if (result == 0) {  
    System.out.println("相等");  
} else if (result > 0) {  
    System.out.println("bd1 大于 bd2");  
} else {  
    System.out.println("bd1 小于 bd2");  
}

5. 转换为其他类型

  • 转换为字符串bd.toString()
  • 转换为 doublebd.doubleValue()(注意精度可能丢失)
  • 转换为 int:需要确定 BigDecimal 的值确实是一个整数,并且不会溢出,然后可以使用 intValueExact()(如果确定值在 int 范围内)或 intValue()(可能丢失精度)。

6. 格式化输出

  • 使用 DecimalFormat 类可以对 BigDecimal 进行格式化输出。
DecimalFormat df = new DecimalFormat("#.00");  
String formattedString = df.format(bd);

7. 注意事项

  • 避免使用 BigDecimal 的 equals 方法来比较两个值是否相等,因为精度问题可能导致预期之外的结果。使用 compareTo 方法代替。
  • 在进行除法运算时,务必指定精度和舍入模式,以避免 ArithmeticException 异常。
  • 尽可能使用字符串来初始化 BigDecimal 对象,以保证精度。
Java 中的 `BigDecimal` 类是一个用于高精度十进制浮点运算的类,提供了精确的十进制控制,避免了浮点数精度不准确导致的错误,在商业计算中非常重要[^4]。以下是 `BigDecimal` 类的常用方法: #### 构造方法 - `BigDecimal(String val)`:将 `String` 类型转换成 `BigDecimal` 类型数据。通常建议优先使用该构造方法,因为它能精确地得到相应的值。例如: ```java BigDecimal a = new BigDecimal("0.1"); ``` - `BigDecimal(double val)`:将 `double` 类型转换成 `BigDecimal` 类型数据。不过,不建议使用该构造方法,因为它不能精确地得到相应的值,值可能会变大[^3]。例如: ```java BigDecimal b = new BigDecimal(0.1); // 不建议使用 ``` - `BigDecimal(int val)`:将 `int` 类型转换成 `BigDecimal` 类型数据。例如: ```java BigDecimal c = new BigDecimal(10); ``` #### 算术运算方法 - `add(BigDecimal value)`:加法,求两个 `BigDecimal` 类型数据的和。例如: ```java BigDecimal a = new BigDecimal("0.1"); BigDecimal b = new BigDecimal("0.2"); BigDecimal sum = a.add(b); // 结果为 0.3 ``` - `subtract(BigDecimal value)`:减法,求两个 `BigDecimal` 类型数据的差。例如: ```java BigDecimal result = a.subtract(b); ``` - `multiply(BigDecimal value)`:乘法,求两个 `BigDecimal` 类型数据的积。例如: ```java BigDecimal product = a.multiply(b); ``` - `divide(BigDecimal divisor, int scale, RoundingMode roundingMode)`:除法,求两个 `BigDecimal` 类型数据的商。`scale` 表示保留的小数位数,`roundingMode` 表示舍入模式。例如: ```java import java.math.RoundingMode; BigDecimal divisor = new BigDecimal("3"); BigDecimal quotient = a.divide(divisor, 2, RoundingMode.HALF_UP); // 保留 2 位小数,四舍五入 ``` #### 其他常用方法 - `compareTo(BigDecimal other)`:比较两个 `BigDecimal` 的大小。返回值为 -1(小于)、0(等于)、1(大于)。例如: ```java int comparison = a.compareTo(b); ``` - `abs()`:返回 `BigDecimal` 的绝对值。例如: ```java BigDecimal absValue = a.abs(); ``` - `pow(int n)`:返回当前 `BigDecimal` 的 `n` 次幂。例如: ```java BigDecimal power = a.pow(2); // a 的平方 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值