0.1 + 0.2 !== 0.3 是 ieee 754 双精度浮点数固有精度限制所致,并非 js 独有 bug;推荐用整数运算(如金额转“分”)、显示层用 tofixed+parsefloat 校准,或引入 decimal.js 等高精度库应对不同场景。

0.1 + 0.2 !== 0.3 是 JavaScript 浮点数精度问题最典型的暴露,根源在于 IEEE 754 双精度表示下,0.1 和 0.2 在二进制中是无限循环小数,存储时被截断,导致计算结果为 0.30000000000000004。这不是 JS 的 bug,而是所有遵循该标准的语言共有的限制。解决的关键是按场景选对抽象方式,而不是强行“修复 JS”。
用整数运算代替小数(推荐用于金额、计数等固定精度场景)
把小数统一放大成整数计算,全程避开浮点参与,零依赖、最可靠。
- 例如金额:统一用“分”为单位
const a = 10; // 0.1 元 → 10 分 const b = 20; // 0.2 元 → 20 分 const sumCents = a + b; // 30 分 const sumYuan = sumCents / 100; // 0.3 元
- 封装时注意动态取最大小数位数,避免硬编码
*100:function toInt(x) { const d = (x.toString().split('.')[1] || '').length; return x * Math.pow(10, d); } function add(...nums) { const factor = Math.max(...nums.map(x => (x.toString().split('.')[1] || '').length)); const scaled = nums.map(x => x * Math.pow(10, factor)); return scaled.reduce((a, b) => a + b, 0) / Math.pow(10, factor); } add(0.1, 0.2); // 0.3⚠️ 注意:若数值过大(如
123456.789 * 1000),可能超出Number.MAX_SAFE_INTEGER(9007199254740991),引发整数精度丢失,此时不适用。
Alibabacloud Sdk Client Initialization For Java下载在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
显示层校准:toFixed + parseFloat(仅用于最终展示)
它不改变计算过程,只修正输出效果,适合 UI 渲染、日志、表单回显等。
- 正确写法(必须转回数值):
parseFloat((0.1 + 0.2).toFixed(10)); // 0.3
- ❌ 错误用法(中间步骤反复调用):
let sum = 0; for (let i = 0; i
-
toFixed(n)返回字符串,且对1.335这类边界值可能不符合数学四舍五入(因底层仍是浮点表示),需留意。
引入高精度库(适合金融、科学计算等强精度需求)
用 decimal.js 或 bignumber.js 提供任意精度的十进制运算,语义清晰、API 成熟。
npm install decimal.js
import { Decimal } from 'decimal.js';
new Decimal(0.1).add(0.2).toString(); // "0.3"
new Decimal('0.1').add('0.2').toString(); // 更稳妥:传字符串避免初始化误差
✅ 优势:支持链式调用、自定义精度、舍入模式;
❌ 注意:不能直接参与原生 + 运算,需显式调用 .add() 等方法,且对象实例有额外开销。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










