大小仅 1KB!超级好用!计算无敌!

js 原生的数字计算是一个令人头痛的问题,最常见的就是浮点数精度丢失。

js 复制代码
// 1. 加减运算
0.1 + 0.2 // 结果:0.30000000000000004(预期 0.3)
0.7 - 0.1 // 结果:0.6000000000000001(预期 0.6)

// 2. 乘法精度偏移
0.1 * 0.2 // 结果:0.020000000000000004(预期 0.02)
3 * 0.3   // 结果:0.8999999999999999(预期 0.9)

// 3. 除法结果异常
0.3 / 0.; // 结果:2.9999999999999996(预期 3)
1.2 / 0.2 // 结果:5.999999999999999(预期 6)

在金额计算的场景中出现这种问题是很危险的,例如「0.1 元 + 0.2 元」本应等于 0.3 元,原生计算却会得出 0.30000000000000004 元,直接导致金额显示错误或支付逻辑异常。

不少人会用toFixed四舍五入,保留 2 位小数来格式化数字,它本质上是 字符串格式化工具,而非精度修复工具 ,而且还会带来新的精度问题 ------ toFixed的四舍五入规则是 "银行家舍入法",无法解决底层计算的精度误差。

js 复制代码
// 问题1. 四舍五入规则不符合预期
1.005.toFixed(2); // 结果:"1.00"(预期 "1.01")
2.005.toFixed(2); // 结果:"2.00"(同样问题)
1.235.toFixed(2); // 结果:"1.23"(预期 "1.24")

// 问题2. 无法修复底层计算误差
const sum = 0.1 + 0.2; // 0.30000000000000004
sum.toFixed(2); // 结果:"0.30"(表面正确,但误差仍存在,后续再运算仍然有问题)
sum.toFixed(10); // 结果:"0.3000000000"(仅隐藏误差,未消除)

而 number-precision 能解决这些问题。

number-precision 的优势在哪?

  • 轻量化,大小仅 1kb
  • API 极简化,只有加减乘除和四舍五入
  • 专注精度问题,无额外心智负担
  • 兼容性好,无额外依赖

适用场景

  • 中小型项目、仅需解决基础加减乘除精度问题的场景(如电商、金融类简单计算)
  • 对包体积敏感的前端项目。

如何使用?

bash 复制代码
pnpm install number-precision
js 复制代码
import NP from 'number-precision'

NP.strip(0.09999999999999998); // = 0.1
NP.plus(0.1, 0.2);             //加法计算 = 0.3, not 0.30000000000000004
NP.plus(2.3, 2.4);             //加法计算 = 4.7, not 4.699999999999999
NP.minus(1.0, 0.9);            //减法计算 = 0.1, not 0.09999999999999998
NP.times(3, 0.3);              //乘法计算 = 0.9, not 0.8999999999999999
NP.times(0.362, 100);          //乘法法计算 = 36.2, not 36.199999999999996
NP.divide(1.21, 1.1);          //除法计算 = 1.1, not 1.0999999999999999
NP.round(0.105, 2);            //四舍五入,保留2位小数 = 0.11, not 0.1

混合的计算:

js 复制代码
import NP from 'number-precision'

// (0.8-0.5)x1000,保留2位小数
NP.round(NP.times(NP.minus(0.8, 0.5), 1000), 2)
// 计算股票收益率
NP.round(NP.times(NP.divide(NP.minus(+price, +cost), +cost), 100),2)

更复杂的计算场景用什么

number-precision有短小精悍的优势在,基本的运算都能拿捏,但那些要求更高的计算场景用什么库呢?

总结了目前社区流行的几款计算库,大家按需取用。

库 特点场景 库体积 优势 劣势 适用场景
toFixed 内置方法,仅用于数字格式化,不解决底层精度问题 0 无需额外引入,使用便捷 无法修复计算误差,四舍五入规则非标准 非精确场景的临时格式化
number-precision 轻量化,提供加减乘除、四舍五入基础功能,无多余 1KB 体积极小,API 极简,学习成本低 不支持超大整数,无复杂数学运算 电商价格计算、表单数字校验
big.js 专注十进制浮点数运算,API 简洁,默认精度可配置 6KB 平衡体积与功能,兼容性好 功能少于 decimal.js 中小型项目精确计算、数据统计
decimal.js 功能全面,支持高精度控制、大数字处理、进制转换、三角函数等,可自定义精度配置 32KB 精度极高,功能覆盖全,灵活性强 体积较大,API 较复杂 金融核心计算、科学计算
math.js 全能型数学库,支持表达式解析、矩阵运算、单位转换等复杂数学能力 160KB 综合数学能力强,场景覆盖广 体积庞大,性能开销高 数据可视化、工程计算

附上地址:

number-precision :github.com/nefe/number...

big.js :github.com/MikeMcl/big...

decimal.js :github.com/MikeMcl/dec...

math.js :github.com/josdejong/m...

相关推荐
lovingsoft2 分钟前
Chrome Lighthouse 详解
前端·chrome
鶴哥只手遮天7 分钟前
Gmsh 源码深度解析-第 2 章 几何内核
算法·开源
Qlly12 分钟前
全栈工程师怎么接需求?从一句「加个功能」聊到能开发、能验收
前端·后端
鶴哥只手遮天13 分钟前
Gmsh 源码深度解析-第 9 章 后处理与插件体系
算法·开源
鶴哥只手遮天16 分钟前
Gmsh 源码深度解析-第 7 章 网格质量、优化与高级技术
算法·开源
马可家的菠萝16 分钟前
你的微信“文件传输助手”,是不是已经成了第二个网盘?
前端·后端·架构
略略略啦17 分钟前
Vibe Coding 基于Spec DD和TDD的实践指南
前端
鶴哥只手遮天21 分钟前
OpenFOAM 源码深度剖析 · 第二季-15 实战:手写一个求解器、库与边界条件
算法·开源
鶴哥只手遮天23 分钟前
Gmsh 源码深度解析-第 8 章 数值内核与高阶有限元
算法·开源
鶴哥只手遮天25 分钟前
Gmsh 源码深度解析-第 4 章 网格生成总控与尺寸场
算法·开源