# JS 浮点数精度问题示例

URL: https://caijiao.org/decimaljs/01-intro/02-float-problems
Source: docs/decimaljs/01-intro/02-float-problems.md
Description: 介绍 JavaScript 原生浮点数的精度问题，展示常见的计算误差示例及其影响，并引出高精度计算库 decimal.js 作为解决方案。

JavaScript 使用 IEEE 754 标准的双精度浮点数来表示所有数字，这导致某些十进制小数在二进制中无法精确表示，从而产生了常见的精度问题。

## 常见问题示例

```js
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` 的二进制表示是一个无限循环小数，计算机只能截断它，造成了误差。

## 浮点数精度问题带来的影响

* **比较失败**
  直接用 `===` 比较浮点数时，可能因为微小误差导致判断错误。

* **累积误差**
  多次浮点运算会让误差逐渐累积，最终结果偏离实际。

* **业务逻辑错误**
  在财务、计量等要求高精度的场景中，误差可能导致金额差错，造成严重损失。

## 示例：简单金额计算问题

```js
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`，它能在底层实现十进制运算，准确表达小数，避免误差。
