JS 浮点数精度问题示例
JavaScript 使用 IEEE 754 标准的双精度浮点数来表示所有数字,这导致某些十进制小数在二进制中无法精确表示,从而产生了常见的精度问题。
常见问题示例
console.log(0.1 + 0.2); // 输出: 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // 输出: false
console.log(0.3 - 0.2); // 输出: 0.09999999999999998
console.log(0.3 - 0.2 === 0.1); // 输出: false
console.log(0.1 * 0.2); // 输出: 0.020000000000000004
console.log(0.3 / 0.1); // 输出: 2.9999999999999996
`
这些看似简单的数学运算,结果都不等于我们预期的精确数值。
为什么会出现这种情况?
这是因为计算机内部采用二进制浮点数表示,而很多十进制小数无法用有限的二进制位精确表达。例如十进制小数 0.1 的二进制表示是一个无限循环小数,计算机只能截断它,造成了误差。
浮点数精度问题带来的影响
-
比较失败 直接用
===比较浮点数时,可能因为微小误差导致判断错误。 -
累积误差 多次浮点运算会让误差逐渐累积,最终结果偏离实际。
-
业务逻辑错误 在财务、计量等要求高精度的场景中,误差可能导致金额差错,造成严重损失。
示例:简单金额计算问题
const price = 0.1;
const quantity = 3;
const total = price * quantity;
console.log(total); // 预期 0.3,但实际输出 0.30000000000000004
console.log(total === 0.3); // false
解决方案
为避免这些问题,可以使用专门的高精度数学库,如 decimal.js,它能在底层实现十进制运算,准确表达小数,避免误差。
相关内容
- 为什么需要 decimal.js JavaScript 原生数字类型存在浮点精度问题,导致金融、科学计算等场景出现误差。decimal.js 提供高精度的小数计算支持,解决原生数值缺陷,适合复杂...
- decimal.js 的优势 介绍 decimal.js 库在高精度计算中的优势,包括任意精度支持、丰富的运算功能、多种舍入模式和易用的 API 设计。
- 安装方式 介绍如何在不同环境下安装和引入 decimal.js,包括 npm、yarn 和浏览器 CDN,助你快速集成高精度计算功能。
- 基本使用示例 通过简单示例介绍 decimal.js 的基本用法,包括创建实例和进行常见的加减乘除运算。
- decimal.js 与原生 Number 的对比 通过示例对比 decimal.js 和 JavaScript 原生 Number 类型在数值精度和计算准确性方面的差异,说明 decimal.js 的优势。
- 创建 Decimal 实例 — 构造函数使用 介绍如何使用 decimal.js 的构造函数创建 Decimal 实例,支持多种输入类型及注意事项。