JS小数计算的问题 为什么0.1+0.2 != 0.3

本文探讨了在计算机中浮点数运算出现精度误差的原因,即二进制表示导致的不精确性,并举例0.1+0.2不等于0.3的现象。解决方法包括使用toFixed()方法来限制小数位数,以及特定的计算策略来避免直接的浮点数相加。
问题

当在计算价格或者其它number类型数据的时候,会发现有意想不到的情况
类似0.1+0.2=0.30000000000000004,而不是0.3

原因

在计算机中数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的。
十进制 0.1 转换为二进制为 0.00011001100110011…(循环0011)
十进制 0.2 转换为二进制为 0.0011001100110011…(循环0011)
所以两者相加结果为 0.01001100110011001100110011001100110011001100110011001100
转换成10进制之后得到:0.30000000000000004

解决办法
  • Number(0.1+0.2).toFixed(2)
  • (0.1x10+0.2x10)/10
### JavaScript0.1 + 0.20.3 的原因 在 JavaScript 中,`0.1 + 0.2 !== 0.3` 是因为浮点数的二进制表示方式存在固有的精度损失。计算机中的浮点数遵循 IEEE 754 标准[^1],该标准定义了如何用有限位数存储十进制数值。然而,某些十进制小数无法精确转换为二进制形式,这导致计算过程中出现细微误差。 具体来说,`0.1` 和 `0.2` 在内存中被近似表示为无限循环的小数序列。当这些值相加时,其结果并非恰好等于 `0.3`,而是略微偏离目标值,例如 `0.30000000000000004`[^2]。这种现象源于二进制浮点数系统的本质特性——它无法完全表达所有可能的十进制分数。 为了应对这一问题开发人员通常采用两种策略之一: #### 方法一:使用容差值进行比较 通过引入一个小范围内的偏差(即所谓的 **epsilon**),可以判定两个浮点数是否足够接近从而视为相等。以下是实现此逻辑的一段代码示例: ```javascript const a = 0.1; const b = 0.2; const sum = a + b; const epsilon = Number.EPSILON * Math.max(Math.abs(a), Math.abs(b)); // 动态调整容忍度 if (Math.abs(sum - 0.3) < epsilon) { console.log(&#39;Approximately Equal&#39;); } else { console.log(&#39;Not Approximately Equal&#39;); } ``` 这种方法利用了一个动态计算出来的最小可分辨差异作为阈值[^1]。 #### 方法二:四舍五入处理 另一种解决方案是对最终的结果应用数学上的取整操作,强制消除多余的尾部数字。下面展示了一种简单的做法: ```javascript function addWithRounding(x, y) { return parseFloat((x + y).toFixed(10)); } console.log(addWithRounding(0.1, 0.2)); // 输出应显示为 "0.3" ``` 这里调用了 `.toFixed()` 函数指定保留的有效位数,并借助 `parseFloat()` 将字符串重新解析回数字类型[^2]。 总结而言,JavaScript 遵循通用编程语言对于浮点运算的规定,因此也继承了类似的局限性。理解并妥善管理这类情况有助于编写更加健壮的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值