在前端开发中,JavaScript 的原生 Number 类型在处理 高精度计算 或 大数字(如财务、加密货币) 时,常常会出现如下问题:

❌ 精度丢失、浮点误差、不支持无限大整数

这时候,我们可以使用 BigNumber.js 来精准地处理数学计算,避免精度陷阱。


🎯 为什么要用 BigNumber.js?

❗ JavaScript Number 的限制

0.1 + 0.2 === 0.3; // ❌ false
9999999999999999 + 1; // → 10000000000000000 (失真)
  • JS 的 Number 类型是 IEEE 754 双精度浮点数,最多安全表示 2^53-1。
  • 计算机中 0.1 无法精确表示,因此 0.1 + 0.2 !== 0.3

✅ BigNumber.js 特性

  • 精确的加减乘除运算
  • 支持任意长度的整数/小数
  • 支持链式调用
  • 用于金融、电商、链上资产等精准计算场景

📦 安装 BigNumber.js

npm install bignumber.js

或使用 CDN:

<script src="https://cdn.jsdelivr.net/npm/bignumber.js"></script>

🧩 基础用法示例

import BigNumber from 'bignumber.js';

// 初始化
const a = new BigNumber(0.1);
const b = new BigNumber(0.2);

// 加法
console.log(a.plus(b).toString()); // ✅ "0.3"

// 减法
console.log(new BigNumber(1).minus(0.9).toString()); // ✅ "0.1"

// 乘法
console.log(new BigNumber(0.6).times(3).toString()); // ✅ "1.8"

// 除法
console.log(new BigNumber(1).dividedBy(3).toString()); // ✅ "0.3333333..."

🧠 精度控制 & 四舍五入

const a = new BigNumber(1).dividedBy(3);

// 保留两位小数,四舍五入
console.log(a.toFixed(2)); // "0.33"

// 保留三位小数,不足补0
console.log(a.toFormat(3)); // "0.333"

🔐 金融场景常用设置

BigNumber.config({
  DECIMAL_PLACES: 10,  // 默认保留小数位
  ROUNDING_MODE: BigNumber.ROUND_HALF_UP // 四舍五入
});

🧪 对比示例:原生 vs BigNumber

操作JS 原生结果BigNumber
0.1 + 0.20.30000000000000004 ❌"0.3" ✅
0.1 * 0.70.06999999999999999 ❌"0.07" ✅
9999999999999999 + 110000000000000000 ❌"10000000000000000" ✅

🌐 在 Vue / React 项目中的用法建议

// Vue3 中:script setup
<script setup lang="ts">
import BigNumber from 'bignumber.js';

const price = new BigNumber(0.1).plus(0.2).toFixed(2);
</script>

或封装成一个 useBigNumber 工具函数。


🧰 可替代方案对比

库名特点
bignumber.js✅ 简单、轻量、适合前端
decimal.js精度更强,支持更复杂数学函数
BigInt(原生)仅支持整数,不支持小数
math.js包含矩阵、复数等高级数学功能

📌 实战建议

  • 💰 金融、电商价格等场景 强烈推荐使用 BigNumber.js
  • 🚫 不建议直接用 Number.toFixed() 处理钱,仍有误差
  • 🧪 用 .isEqualTo() 判断等值,避免 JS 原生误判
new BigNumber(0.1).plus(0.2).isEqualTo(0.3); // ✅ true

✅ 总结一句话

如果你的项目涉及小数计算、价格、金额、精度要求较高,用 BigNumber.js 替代 JavaScript 原生 Number,是前端精度计算的标准做法。