decimal.js 中文文档
任意精度(arbitrary-precision)十进制运算库 for JavaScript
- 版本:10.6.0(本文档全部示例均基于该版本实测验证)
- 作者:Michael Mclaughlin(MikeMcl/decimal.js)
- 协议:MIT
- 官方文档:mikemcl.github.io/decimal.js
decimal.js 是什么
decimal.js 是一个零依赖的 JavaScript 库,提供任意精度的十进制数类型 Decimal,用于解决原生 Number 的二进制浮点误差(如 0.1 + 0.2 !== 0.3)与位数限制(如超出 2⁵³ 的整数)问题。
它也是 math.js 内部使用的高精度运算库。
核心特性:
| 特性 | 说明 |
|---|---|
| 整数与小数 | 支持任意精度的十进制数 |
| 有效数字精度 | 精度以**有效数字(significant digits)**计,而非小数位 |
| 全面舍入 | 所有计算结果都按 precision 与 rounding 舍入(类似 Python decimal 模块) |
| 数学函数 | 三角函数、反三角函数、双曲函数、对数、指数、开方、幂等 |
| 进制支持 | 可解析/输出二进制、八进制、十六进制(含小数与指数形式) |
| 不可变对象 | 方法不修改原对象,返回新 Decimal,可链式调用 |
| 兼容性好 | 仅使用 ECMAScript 3 特性,浏览器 / Node.js / Deno 通用 |
| 类型完备 | 附带 TypeScript 声明文件 decimal.d.ts |
| 轻量变体 | 不需要三角函数的场景可用 decimal.js-light |
与同作者其他库的关系:
| 库 | 定位 | 精度单位 | 是否四舍五入所有运算 |
|---|---|---|---|
| big.js | 最小、最简单 | 小数位 | 否(仅除法等) |
| bignumber.js | 功能较全 | 小数位 | 否 |
| decimal.js | 功能最全 | 有效数字 | 是(全部运算) |
文档结构
| 文档 | 内容 | 适合谁 |
|---|---|---|
| 快速入门 | 安装、导入、第一个程序、常用代码片段 | 第一次接触的新手 |
| 核心概念 | 精度、舍入、指数、不可变性、内部结构、精度陷阱 | 想真正理解原理的学习者 |
| 构造函数与输入 | 可接受的输入形式、进制、错误处理 | 所有人 |
| 配置与舍入模式 | set/config/clone、全部配置项、9 种舍入模式 | 需要定制行为的人 |
| 算术运算 | 四则、取模、整除、幂、开方、取整、clamp 等 | 所有人 |
| 比较与判断 | 比较方法、is* 判断、NaN/Infinity 语义 | 所有人 |
| 格式化与输出 | toString/toFixed/toPrecision/toFraction 等 | 需要展示/传输数据的人 |
| 数学函数 | 三角、反三角、双曲、对数、指数、random | 科学计算场景 |
| 最佳实践与常见坑 | 实践建议、错误处理、性能、与同类库对比、坑清单 | 工程实战 |
| 速查表 | 全部方法一页速查、默认值速查 | 随手翻阅 |
建议学习路线
新手:快速入门 → 速查表
进阶:核心概念 → 配置与舍入 → 算术运算/比较与判断/格式化与输出 API 参考
高阶:数学函数 → 最佳实践与常见坑
教授/回顾:以 速查表为纲,按需回到对应章节三个最常用的知识点
js
const Decimal = require('decimal.js');
// 1. 传入字符串,避免 Number 精度损失
new Decimal('0.1').plus('0.2') // '0.3'
// 2. 链式调用,方法不修改原值
new Decimal(0.3).minus(0.1) // '0.2'
// 3. 按需配置精度(有效数字位数)与舍入模式
Decimal.set({ precision: 30, rounding: Decimal.ROUND_HALF_UP })约定说明
- 本文档示例中省略了
toString()的显式调用;注释中以引号包裹的字符串表示该表达式调用toString()后的输出。 - 所有示例输出均为 decimal.js 10.6.0 在 Node.js 下的实测结果。
- 文档中「返回
Decimal」表示返回一个新的Decimal实例(原值不变)。
