javascript浮点数精度丢失是ieee 754标准固有限制,非bug;应避免直接等值判断或高精度运算,推荐用整数代替(如金钱用“分”)、tofixed+parsefloat处理显示、decimal.js等库应对高精度需求,或用epsilon误差范围比较相等。

JavaScript 中浮点数计算精度丢失,本质是二进制无法精确表示某些十进制小数(比如 0.1 + 0.2 !== 0.3),这不是 bug,而是 IEEE 754 双精度浮点数标准的固有限制。解决的关键不是“修复”浮点数,而是**避开直接用浮点数做等值判断或高精度金融/测量运算**。
用整数代替浮点数做运算(最推荐)
把单位换算成最小可分单位,全程用整数计算,最后再转回显示形式。这是最可靠、无额外依赖的方式。
- 金钱计算:统一用「分」为单位,12.34 元 → 1234 分,加减乘除全用整数,结果再除以 100 显示
- 尺寸/时间:如 1.5 米 → 150 厘米;0.25 秒 → 250 毫秒
- 避免在中间步骤使用
parseFloat或小数输入直接参与计算
需要保留小数时,用 toFixed + parseFloat 组合处理显示值
toFixed() 返回字符串,能控制小数位数,但注意它只是四舍五入显示,不改变原始数值精度。若需用于后续计算,必须配合 parseFloat 转回数字(虽然仍可能有误差,但已限定在指定精度内)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
(0.1 + 0.2).toFixed(1) // "0.3"-
parseFloat((0.1 + 0.2).toFixed(10)) // 0.3(适用于对精度要求不严的展示场景) - ⚠️ 不要链式调用
toFixed().toFixed(),会报错;也不要对大数用 toFixed,可能出科学计数法
高精度需求场景:用专门的库(如 decimal.js 或 big.js)
当必须做多步小数运算且要求严格精度(如财务系统、科学计算),建议引入轻量库,它们用字符串或整数数组模拟十进制运算。
import { Decimal } from 'decimal.js'new Decimal(0.1).plus(0.2).equals(0.3) // true- 支持加减乘除、幂、比较、设定精度和舍入模式
- 比自己写「乘100再除100」更健壮,尤其涉及除法、循环小数时
判断相等时,不用 ===,改用误差范围(EPSILON)比较
对于「是否接近某个值」的逻辑(如动画结束判断、传感器阈值),不要写 a === b,而应检查差值是否小于一个极小量。
function isEqual(a, b, epsilon = Number.EPSILON) { return Math.abs(a - b)- 金融等关键场景可设更宽松的 epsilon,如
1e-6(百万分之一) - ES2024 已提案
Number.isClose(),目前可用 polyfill 或直接手写
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










