# 算法随手记

工程里遇到的小算法和 JavaScript 技巧都记在这一页。每则可以单独复制，新内容继续向下追加。

## 01. JavaScript 如何四舍五入到 n 位小数？

要把 12.3456 四舍五入到 2 位小数，可以组合 Math.round() 和 10 ** n。

### 直接用

```js
function roundTo(value, n) {
  const factor = 10 ** n;
  return Math.round(value * factor) / factor;
}

roundTo(12.3456, 2); // 12.35
roundTo(12.344, 2);  // 12.34
roundTo(12, 2);      // 12
```

### 计算过程

- Math.round(x)：把 x 四舍五入到整数。
- 10 ** n：得到 10 的 n 次方。

保留 2 位小数时，n 等于 2，factor 就是 100：

```text
12.3456 × 100 = 1234.56
Math.round(1234.56) = 1235
1235 ÷ 100 = 12.35
```

![保留两位小数时，先乘 100、取整，再除以 100](https://herblab.online/qwen-imgs/algorithm-notes-decimal-shift-v1.png)<!-- display-width:640 -->

### 注意

roundTo() 返回数字，所以 roundTo(12, 2) 的结果是 12，不会保留末尾的两个 0。只做页面展示时，可以使用 toFixed()：

```js
(12).toFixed(2); // "12.00"
```

JavaScript 使用二进制浮点数，1.005 之类的值可能出现精度误差。金额计算不要直接使用这个函数，应改用整数最小单位或精确小数方案。
