Android :关于小数相加出现很多位的 BigDecimal 也会有时不靠谱原因

本文探讨了使用Java BigDecimal类进行数值运算时遇到的精度问题,通过实例展示了使用字符串构造BigDecimal对象的重要性,以及如何避免浮点数转换带来的误差。

    BigDecimal

                BigDecimal bigDecimal1= new BigDecimal(0.0);
		BigDecimal bigDecimal2= new BigDecimal(1.001);
		BigDecimal bigDecimal3= new BigDecimal("0.0");
		BigDecimal bigDecimal4= new BigDecimal("1.001");
		
		for (int i = 0; i <5; i++) {
			bigDecimal1 = bigDecimal1.add(bigDecimal2);
			System.out.println(bigDecimal1);
		}
		
		System.out.println("---------------------------");
		for (int i = 0; i <5; i++) {
			bigDecimal3 = bigDecimal3.add(bigDecimal4);
			System.out.println(bigDecimal3);
		}

输出结果:

1.000999999999999889865875957184471189975738525390625
2.001999999999999779731751914368942379951477050781250
3.002999999999999669597627871553413569927215576171875
4.003999999999999559463503828737884759902954101562500
5.004999999999999449329379785922355949878692626953125
---------------------------
1.001
2.002
3.003
4.004
5.005


可以明显看出

bigDecimal1 不正常  <pre name="code" class="java">bigDecimal3  正常
就是当我们相加的时候 最好new BigDecimal(字符串)


`BigDecimal` 是 Java 中的一个类,用于处理高精度的十进制数。它特别适合金融计算等领域,因为这类应用需要非常精确的小数运算,并且避免了二进制浮点数(如 `float` 和 `double`)带来的舍入误差。 ### BigDecimal 相加 要在两个 `BigDecimal` 数之间进行相加操作,你可以使用 `add()` 方法: ```java import java.math.BigDecimal; public class Main { public static void main(String[] args) { // 创建两个 BigDecimal 对象 BigDecimal num1 = new BigDecimal("10.5"); BigDecimal num2 = new BigDecimal("20.7"); // 使用 add() 方法将它们相加 BigDecimal sum = num1.add(num2); System.out.println("两者的和是:" + sum); } } ``` 上述代码会输出结果:`两者的和是:31.2` ### 设置小数位 当你想要控制 `BigDecimal` 的保留小数位数时,可以使用 `setScale()` 方法。此方法允许你指定所需的规模以及如何处理多余的数字(四舍五入规则)。以下是几种常见的用法示例: #### 四舍五入到两小数 ```java // 第一个参数是要设置的小数位数,第二个参数是指定的舍入模式 (RoundingMode) BigDecimal roundedNum = sum.setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println(roundedNum); ``` #### 截断至三小数做任何四舍五入 ```java BigDecimal truncatedNum = sum.setScale(3, BigDecimal.ROUND_DOWN); System.out.println(truncatedNum); ``` 通过这种方式,您可以轻松地对数值进行精准的操作并保持所需的有效数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值