登录
首页 >  文章 >  前端

0.1+0.2不等于0.3怎么处理?

时间:2026-04-11 17:15:35 322浏览 收藏

JavaScript中0.1 + 0.2 !== 0.3这一看似反直觉的现象,源于浮点数在二进制下的固有精度限制,并非语言缺陷;真正可靠的解决方案是摒弃直接的严格相等比较,转而采用基于Number.EPSILON的误差容忍判断、将小数放大为整数运算(尤其适用于金额等场景),或在高精度需求下引入decimal.js等专业数学库——掌握这些方法,就能彻底避开浮点陷阱,写出更健壮、可预测的数值逻辑。

JavaScript中浮点数0.1加0.2不等于0.3的解决办法

JavaScript中0.1 + 0.2 === 0.3返回false,这是浮点数二进制表示的固有局限导致的精度丢失,并非Bug。解决的关键是**避免直接用===比较浮点结果,改用误差容忍判断或转整数运算**。

使用Number.EPSILON进行误差范围比较

ES6引入了Number.EPSILON(约2.22e-16),代表JS能表示的最小精度差值,适合做“近似相等”判断:

  • 定义一个通用的浮点数相等函数:
    function isEqual(a, b) { return Math.abs(a - b)
    isEqual(0.1 + 0.2, 0.3)true
  • 注意:该方法适用于大多数场景,但对极大或极小数值需调整容差(如用相对误差)

乘以10的幂次转为整数再计算

对涉及金额、百分比等固定小数位的运算,最稳妥的方式是先放大为整数:

  • 例如保留1位小数:Math.round(0.1 * 10) + Math.round(0.2 * 10) === Math.round(0.3 * 10)true
  • 封装成工具函数:
    function add(a, b, decimals = 1) { const factor = Math.pow(10, decimals); return (Math.round(a * factor) + Math.round(b * factor)) / factor; }
    add(0.1, 0.2)0.3

使用专门的数学库处理高精度需求

当项目频繁涉及金融计算或科学运算时,推荐引入成熟库:

  • decimal.js:支持任意精度十进制运算,API简洁
    Decimal.set({ precision: 20 }); new Decimal(0.1).plus(0.2).equals(0.3)true
  • big.js:轻量(new Big(0.1).plus(0.2).equals('0.3')

避免在条件判断中直接使用浮点运算结果

尤其警惕if (a + b === c)这类写法:

  • 改为if (Math.abs(a + b - c) (根据业务精度选阈值)
  • 循环计数器不用浮点增量:
    for (let i = 0.1; i (可能多执行一次或少执行)
    for (let i = 1; i

理论要掌握,实操不能落!以上关于《0.1+0.2不等于0.3怎么处理?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>