LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?

zhenglin
2026年10月13日 12:6 本文热度 221

​这是 JavaScript 中非常经典的问题,本质上不是 0.1 + 0.2 算错了,而是 IEEE 754 浮点数无法精确表示某些十进制小数。


1. 为什么 0.1 + 0.2 !== 0.3?

JavaScript 的 Number 使用 IEEE 754 双精度浮点数(64 bit) 。

十进制的 0.1、0.2 在二进制中都是无限循环小数:

0.1 (十进制)

↓

0.000110011001100110011... (二进制)

所以 JavaScript 只能存储它们的近似值。

实际上可以近似理解为:

0.1 ≈ 0.10000000000000000555

0.2 ≈ 0.20000000000000001110


两者相加

≈ 0.30000000000000004441

因此:

0.1 + 0.2 === 0.3

// false


console.log(0.1 + 0.2)

// 0.30000000000000004

而 0.3 本身也只是一个接近 0.3 的浮点数,只是它和 0.1 + 0.2 最终得到的浮点表示不同。


2. 最常用的解决方案:误差范围比较

如果是普通数值计算,推荐使用误差范围:

Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON

// true

更实用一点,可以封装:

function nearlyEqual(a, b, epsilon = Number.EPSILON) {

  return Math.abs(a - b) < epsilon;

}


nearlyEqual(0.1 + 0.2, 0.3);

// true

不过要注意:对于特别大或特别小的数字,固定 Number.EPSILON 不一定合适,工程中通常会使用相对误差。


3. 金融金额:不要直接用浮点数

例如:

const price = 0.1;

const quantity = 3;


console.log(price * quantity);

如果涉及金额、订单、支付、财务计算,更推荐把金额转换成整数的最小单位。

例如人民币使用“分”:

const price = 10; // 0.10 元 = 10 分

const quantity = 3;


const total = price * quantity;


console.log(total / 100);

// 0.3

也就是说:

0.1 元 → 10 分

0.2 元 → 20 分

0.3 元 → 30 分

整数计算就不会产生这种浮点误差。


4. 需要精确小数计算:使用 Decimal 库

例如使用 decimal.js:

import Decimal from 'decimal.js';


const result = new Decimal('0.1')

  .plus(new Decimal('0.2'));


console.log(result.toString());

// "0.3"

这里特别注意:

new Decimal(0.1)

不如:

new Decimal('0.1')

因为如果你先把 0.1 作为 JavaScript Number 创建出来,浮点误差已经产生了。


5. 现代 JavaScript 还可以考虑 BigInt

BigInt 可以精确处理整数:

const a = 10000000000000000n;

const b = 20000000000000000n;


console.log(a + b);

// 30000000000000000n

但它不能直接处理小数:

0.1n // SyntaxError

所以金额场景依然通常是:

0.1 元 → 10n 分

而不是直接存储小数。


JavaScript 的 Number 使用 IEEE 754 双精度浮点数,0.1 和 0.2 无法在二进制浮点格式中被精确表示,只能存储近似值,所以两者相加得到的结果与 0.3 的浮点表示并不完全相同。

普通计算可以使用误差范围比较,例如 Math.abs(a - b) < Number.EPSILON;涉及金额等精确小数计算时,应该使用整数最小单位,或者使用 Decimal 等高精度计算库。


一句话记忆:

0.1 + 0.2 !== 0.3

        ↓

IEEE 754 浮点数精度问题

        ↓

普通计算 → 误差比较

金额计算 → 整数分/厘

高精度小数 → Decimal


阅读原文:点击这里


该文章在 2026/10/13 12:06:06 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-1  粤公网安备44030602007207号