BigDecimal用法总结

本文总结了BigDecimal在项目中的使用,包括加减乘除操作、设置精度以及实现取反的方法,确保高精度的财务计算。

BigDecimal常用于金额的计算,下面总结下这次项目中BigDecimal的用法。

1.加减乘除

2.设置精度

3.取反

加减乘除分别调用函数

        public BigDecimal add(BigDecimal value);
        public BigDecimal subtract(BigDecimal value);
        public BigDecimal multiply(BigDecimal value);
        public BigDecimal divide(BigDecimal value);

举例:

        BigDecimal a=new BigDecimal(10.0);
        BigDecimal b=new BigDecimal(9.1);
        System.out.println(a.subtract(b));

精度设置,为什么会设置精度,给大家看个效果

代码如下:

        BigDecimal abig=new BigDecimal(10.0);
        BigDecimal bbig=new BigDecimal(9.1);
        BigDecimal cbig=new BigDecimal(8.9);

        System.out.println(abig.subtract(bbig));
        System.out.println(abig.subtract(cbig));

结果如下:

0.9000000000000003552713678800500929355621337890625
1.0999999999999996447286321199499070644378662109375
并不是我们希望看到的0.9和1.1,原因就是转成二进制的时候会有精度问题,导致这样的结果。所以我们可以在运算的时候加精度,也可以在实例化BigDecimal的时候用字符串。

设置精度的方法:

        System.out.println(abig.subtract(bbig).setScale(2, BigDecimal.ROUND_HALF_UP));
        System.out.println(abig.subtract(cbig).setScale(2, BigDecimal.ROUND_HALF_UP));
这样设置两位精度就可以啦

0.90
1.10
字符串实例化的方法:

        BigDecimal abig=new BigDecimal("10.0");
        BigDecimal bbig=new BigDecimal("9.1");
        BigDecimal cbig=new BigDecimal("8.9");


取反

因为Bigdecimal是无法直接用+-*/这些符号进行计算的,所以取反的时候也需要一个单独的方法来实现:

        System.out.println(abig.negate());
这样就会拿到它的相反数了:

-10.0
这些是这次项目中用到的点





<think> 我们被要求提供BigDecimal用法大全。根据多个引用,我们可以总结BigDecimal的创建、常用计算方法、特殊用法以及注意事项。 引用[1]提到了创建BigDecimal对象、常用计算方法和几个方便用法(如去除多余的0、比较大小等)。 引用[2]给出了加减乘除的示例代码。 引用[3]强调了使用字符串构造器以避免精度损失。 引用[4]则概述了BigDecimal的适用场景和注意事项。 因此,我们可以按照以下结构组织回答: 1. 创建BigDecimal对象(重点推荐使用字符串构造器) 2. 常用计算方法(加减乘除等) 3. 其他实用方法(如去除尾部零、比较大小、格式化等) 4. 注意事项(避免使用double构造器、舍入模式等) 5. 适用场景(精确计算,金融等) 同时,根据系统指令,数学公式和代码块需要正确使用格式。 注意:由于要求使用中文回答,并且生成相关问题,我们将在最后添加相关问题。 注意:引用标识要自然地添加到段落末尾,例如[^1]。 </think> ### BigDecimal 用法大全 #### 一、创建 BigDecimal 对象(推荐方式) 1. **字符串构造器**(避免精度损失): ```java BigDecimal a = new BigDecimal("10.5"); // 精确表示10.5 BigDecimal b = new BigDecimal("0.03"); // 精确表示0.03 [^3] ``` 2. **其他构造器**(谨慎使用): ```java BigDecimal c = BigDecimal.valueOf(12.34); // 内部转字符串再构造 BigDecimal d = new BigDecimal(12.34); // 可能产生精度问题[^1][^3] ``` #### 二、基本运算方法 ```java BigDecimal x = new BigDecimal("10"); BigDecimal y = new BigDecimal("3"); // 加减乘除 BigDecimal add = x.add(y); // 13 BigDecimal subtract = x.subtract(y); // 7 BigDecimal multiply = x.multiply(y); // 30 BigDecimal divide = x.divide(y, 2, RoundingMode.HALF_UP); // 3.33 [^2][^4] ``` > **关键点**:除法必须指定舍入模式(`RoundingMode`),否则可能抛出 `ArithmeticException`。 #### 三、特殊操作 1. **去除尾部多余的零**: ```java BigDecimal num = new BigDecimal("12.3000"); System.out.println(num.stripTrailingZeros()); // 输出12.3 [^1] ``` 2. **比较大小**(推荐方式): ```java int result = a.compareTo(b); // result = -1 (a < b), 0 (a = b), 1 (a > b) [^1] ``` > 避免使用 `equals()`(会对比精度位数),如 `new BigDecimal("1.0").equals(new BigDecimal("1"))` 返回 `false`。 3. **精度控制与格式化**: ```java BigDecimal num = new BigDecimal("123.4567"); num.setScale(2, RoundingMode.HALF_UP); // 保留两位小数 → 123.46 String formatted = new DecimalFormat("#,##0.00").format(num); // 123.46 [^1][^4] ``` #### 四、注意事项 1. **构造陷阱**: ```java // 错误示例(精度丢失): new BigDecimal(0.1); // 实际值≈0.10000000000000000555... // 正确做法: new BigDecimal("0.1"); // 精确表示0.1 [^3] ``` 2. **除法必须指定舍入模式**: ```java // 错误示例: bigDecimal1.divide(bigDecimal2); // 可能抛出异常 // 正确做法: bigDecimal1.divide(bigDecimal2, RoundingMode.HALF_UP); [^4] ``` 3. **不可变性**:所有运算返回新对象,原对象不变。 #### 五、适用场景 1. 金融计算(金额、利率) 2. 科学计算(高精度需求) 3. 精确比较小数(如商品库存) 4. 避免浮点数精度问题(如 `0.1 + 0.2 ≠ 0.3`)[^4] --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值