bignumber.js深度解析:驾驭任意精度计算的终极武器

一、核心痛点:为什么需要bignumber.js?

1.1 JavaScript的数字精度灾难

javascript 复制代码
// 经典精度问题
console.log(0.1 + 0.2 === 0.3); // false

// 大数溢出问题
const MAX = Number.MAX_SAFE_INTEGER; // 9007199254740991
console.log(MAX + 1 === MAX + 2); // true!

二、快速入门:基础运算四步法

2.1 安装与引入

bash 复制代码
npm install bignumber.js
javascript 复制代码
import BigNumber from 'bignumber.js';

2.2 创建BigNumber对象

javascript 复制代码
// 从字符串创建(推荐,避免精度损失)
const num1 = new BigNumber('0.1');

// 从数字创建(不推荐)
const num2 = new BigNumber(0.2); 

// 从其他BigNumber实例创建
const num3 = new BigNumber(num1);

2.3 基本运算

javascript 复制代码
const sum = num1.plus(num2); // 0.3
const diff = num1.minus(0.05); // 0.05
const product = num1.times(10); // 1
const quotient = num1.dividedBy(3); // 0.333333...

2.4 结果输出

javascript 复制代码
// 转换为字符串
sum.toString(); // '0.3'

// 保留小数位
quotient.toFixed(4); // '0.3333'

// 转换为原始数字(注意精度风险)
product.toNumber(); // 1

三、高级运算:金融级精度控制

3.1 精度与舍入模式

javascript 复制代码
// 全局配置精度
BigNumber.set({ DECIMAL_PLACES: 10 });

// 单个运算控制
const pi = new BigNumber('3.1415926535');
pi.dividedBy(2).toFixed(4); // 默认四舍五入:'3.1416'

//指定特定舍入法
pi.toFixed(4, BigNumber.ROUND_HALF_EVEN); // '3.1416' 

3.2 比较与判断

javascript 复制代码
const a = new BigNumber('0.0000000001');
const b = new BigNumber('0.0000000000000000001');

// 精度比较
a.isGreaterThan(b); // true
a.isLessThanOrEqualTo(b); // false

// 特殊值检测
const nan = new BigNumber(NaN);
nan.isNaN(); // true

const inf = new BigNumber(Infinity);
inf.isFinite(); // false

3.3 数学函数

javascript 复制代码
// 开平方
const sq = new BigNumber(256).sqrt(); // 16

// 指数运算
const exp = new BigNumber(2).exponentiatedBy(10); // 1024

// 模运算
new BigNumber(15).mod(4); // 3

四、最佳实践指南

4.1 安全操作规范

javascript 复制代码
// ✅ 始终使用字符串初始化
new BigNumber('0.00000001');

// ❌ 避免浮点数初始化
new BigNumber(0.00000001); // 可能不精确

// ✅ 重要计算指定舍入模式
value.decimalPlaces(8, BigNumber.ROUND_HALF_UP);

// ✅ 使用自定义错误处理
try {
  const result = new BigNumber('abc');
} catch (e) {
  console.error('Invalid number:', e.message);
}

4.2 类型定义(TypeScript)

typescript 复制代码
import { BigNumber } from 'bignumber.js';

interface FinancialResult {
  total: BigNumber;
  tax: BigNumber;
}

function calculateInvoice(amount: string): FinancialResult {
  const amountBN = new BigNumber(amount);
  const tax = amountBN.times(0.1);
  
  return {
    total: amountBN.plus(tax),
    tax
  };
}

结语

官网地址 :mikemcl.github.io/bignumber.j...
GitHub仓库 :github.com/MikeMcl/big...


如果你喜欢本教程,记得点赞+收藏!关注我获取更多JavaScript开发干货。

相关推荐
恋猫de小郭2 分钟前
Flutter 的文字为什么比 SwiftUI 更细?问题主要在 Skia 的 256 项查找表里
android·前端·flutter
lexiangqicheng4 分钟前
前端高阶面试核心通关指南:深入解析Vue3与React18底层原理及性能优化
前端·面试·性能优化
怕浪猫5 分钟前
前端对接聊天 API:我用 React 做了一个比 ChatGPT 还好看的界面
前端·后端·面试
程序员小孔.9 分钟前
基于 Spring Cloud + Vue 的 JEEWMS 开源仓储管理平台设计与实现
前端·javascript·vue.js·spring boot·spring cloud·开源
IT_陈寒10 分钟前
深入理解Python:核心原理与最佳实践
前端·人工智能·后端
创世虚拟世界14 分钟前
把 3D 虚拟世界拉到本地:vibe coding 的手感,是从看见自己那一行改动开始的
javascript·数据库·人工智能·3d·gitee·虚拟现实
我喜欢就喜欢22 分钟前
Chrome 插件开发实战指南
前端·chrome
夕阳_醉了24 分钟前
花了一天的时间,地板式扫盲了vue3所有API盲点
前端·javascript·vue.js
LinDaiuuj34 分钟前
Figma Specs 高效交付与开发协作指南
前端·figma
我命由我123451 小时前
5-2.Python 编码进阶 - 字符串进阶(拼接、普通格式化、普通格式化数字精度控制、快速格式化、遍历、常用方法)
java·开发语言·后端·python·学习·java-ee·学习方法