BigDecimal用法总结

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>我们被要求使用中文回答,并且遵循特定的格式要求。用户的问题是关于Java BigDecimal的使用教程和示例。 根据提供的引用,我们可以总结出以下关键点: 1. 创建BigDecimal对象:有三种主要方式,但推荐使用字符串构造器或valueOf方法。 2. 常用方法:加法(add)、减法(subtract)、乘法(multiply)、除法(divide)等。 3. 注意事项:避免使用double构造器,因为可能存在精度问题。 我们将按照以下结构回答: 1. 创建BigDecimal对象 2. 常用算术运算方法 3. 除法运算的特殊处理(因为可能需要指定精度和舍入模式) 4. 比较操作 5. 注意事项和最佳实践 6. 示例代码 同时,我们需要生成相关问题。 注意:在回答中,行内数学表达式用$...$,独立公式用$$...$$,但本问题可能较少涉及数学公式,但如果有,我们会遵守规则。 另外,在回答末尾添加引用标识,并生成相关问题。 开始回答:</think>### Java BigDecimal 使用教程与示例 #### 一、创建 BigDecimal 对象(推荐方式) 1. **字符串构造器**(避免精度损失) ```java BigDecimal a = new BigDecimal("0.1"); // 精确值 0.1 BigDecimal b = new BigDecimal("1.34"); // 精确值 1.34 ``` 2. **valueOf() 方法**(自动处理 double 转换) ```java BigDecimal c = BigDecimal.valueOf(0.2); // 推荐替代 new BigDecimal(double) ``` 3. **避免使用 double 构造器**(可能产生精度问题) ```java // 不推荐:实际值为 0.100000000000000005551115... BigDecimal d = new BigDecimal(0.1); ``` #### 二、常用算术运算 ```java BigDecimal num1 = new BigDecimal("10.5"); BigDecimal num2 = new BigDecimal("3.2"); // 加法 BigDecimal sum = num1.add(num2); // 13.7 // 减法 BigDecimal diff = num1.subtract(num2); // 7.3 // 乘法 BigDecimal product = num1.multiply(num2); // 33.60 // 除法(必须指定精度和舍入模式) BigDecimal quotient = num1.divide(num2, 2, RoundingMode.HALF_UP); // 3.28 ``` #### 三、除法运算注意事项 必须显式**指定精度和舍入规则**,否则可能抛出 `ArithmeticException`: ```java // 正确做法:保留2位小数,四舍五入 BigDecimal result = new BigDecimal("10").divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP); // 错误示例:未指定精度会导致异常 // BigDecimal error = new BigDecimal(10).divide(new BigDecimal(3)); ``` #### 四、精度控制与舍入模式 ```java BigDecimal num = new BigDecimal("3.14159"); // 设置精度(四舍五入) BigDecimal rounded = num.setScale(3, RoundingMode.HALF_UP); // 3.142 // 常用舍入模式: // - HALF_UP: 四舍五入 // - CEILING: 向正无穷舍入 // - FLOOR: 向负无穷舍入 ``` #### 五、比较操作 使用 `compareTo()` 而非 `equals()`(后者会对比精度): ```java BigDecimal x = new BigDecimal("2.00"); BigDecimal y = new BigDecimal("2.0"); boolean isEqual = (x.compareTo(y) == 0); // true(值相等) boolean isSame = x.equals(y); // false(精度不同) ``` #### 六、最佳实践示例 ```java // 精确计算货币(单位:元) BigDecimal price = new BigDecimal("19.99"); BigDecimal quantity = BigDecimal.valueOf(5); // 总金额 = 19.99 * 5 = 99.95 BigDecimal total = price.multiply(quantity) .setScale(2, RoundingMode.HALF_UP); // 税费计算(税率6%) BigDecimal taxRate = new BigDecimal("0.06"); BigDecimal tax = total.multiply(taxRate) .setScale(2, RoundingMode.HALF_UP); // 5.99 System.out.println("总计: ¥" + total); // 总计: ¥99.95 System.out.println("税费: ¥" + tax); // 税费: ¥5.99 ``` #### 七、注意事项 1. **不可变性**:所有运算返回新对象,原对象不变[^3]。 2. **避免混合类型**:不要直接与基本类型混合运算,需先转换。 3. **科学计算场景**:涉及指数运算时使用 `pow()` 方法: ```java BigDecimal base = new BigDecimal("2.5"); BigDecimal power = base.pow(3); // 15.625 ``` > **关键点总结**:优先使用字符串构造器或 `valueOf()` 创建对象,除法必须指定精度和舍入模式,比较值用 `compareTo()`,金融计算需显式设置精度[^1][^2][^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值