news 2026/1/18 13:36:36

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大小仅 1KB!超级好用!计算无敌!

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

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.1// 结果:2.9999999999999996(预期 3)1.2/0.2// 结果:5.999999999999999(预期 6)

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

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

// 问题1. 四舍五入规则不符合预期1.005.toFixed(2);// 结果:"1.00"(预期 "1.01")2.005.toFixed(2);// 结果:"2.00"(同样问题)1.235.toFixed(2);// 结果:"1.23"(预期 "1.24")// 问题2. 无法修复底层计算误差constsum=0.1+0.2;// 0.30000000000000004sum.toFixed(2);// 结果:"0.30"(表面正确,但误差仍存在,后续再运算仍然有问题)sum.toFixed(10);// 结果:"0.3000000000"(仅隐藏误差,未消除)

number-precision能解决这些问题。

number-precision 的优势在哪?

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

适用场景

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

如何使用?

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

混合的计算:

importNPfrom'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综合数学能力强,场景覆盖广体积庞大,性能开销高数据可视化、工程计算
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/18 9:10:54

一键 i18n 国际化神库!适配 Vue、React!

一键 i18n 国际化神库!适配 Vue、React! 作为一名前端开发,给项目做多语言早已是家常便饭。 可每次面对成百上千条文案,“一行行手动翻译 维护 N 个 JSON 文件”仍然是让人头秃的体力活。 今天就把我实测有效的 3 款零入侵、一…

作者头像 李华
网站建设 2025/12/16 17:16:19

LobeChat能否用于创建商业模式画布?创业项目策划助手

LobeChat:打造你的AI创业策划助手 在今天这个“人人都是产品经理”的时代,一个绝妙的创意可能诞生于咖啡馆的一次闲聊,也可能来自深夜灵光乍现的备忘录。但真正让想法落地的,不是灵感本身,而是如何快速、系统地把它转化…

作者头像 李华
网站建设 2025/12/16 17:14:41

QML/QtQuick3D如何将数据传递给GLSL着色器?

QML 传递给 GLSL Shader中Uniform变量的工作原理详解 QML/QtQuick3D如何将数据传递给GLSL着色器? 例如 // 在Shader代码中直接使用 pos.x (c0 c1 * pos.z c2 * pos.z * pos.z c3 * pos.z * pos.z * pos.z);中c0, c1, c2, c3 在着色器中没有声明但是又可以直接…

作者头像 李华
网站建设 2026/1/17 7:22:41

RocketMQ 监控与告警:Prometheus + Grafana 可视化监控搭建

在分布式消息中间件的生产实践中,“看得见”才能“控得住”。RocketMQ作为阿里开源的高性能消息队列,其运行状态直接影响业务链路的稳定性。本文将聚焦RocketMQ监控体系的核心搭建方案——基于Prometheus采集指标、Grafana可视化展示,带你从零…

作者头像 李华
网站建设 2026/1/6 7:47:25

RocketMQ Broker 故障恢复:主从切换、数据同步与集群自愈机制

在分布式消息中间件的架构中,RocketMQ 凭借高吞吐、低延迟的特性占据重要地位,而 Broker 作为消息存储与转发的核心节点,其可用性直接决定了整个消息系统的稳定性。一旦 Broker 出现故障,如何快速实现故障恢复、保障消息不丢失、业…

作者头像 李华
网站建设 2026/1/15 20:10:02

ip版SSL证书

解决获得一本被浏览器信任的IP版本的SSL证书,你必须满足以下条件:1、这是一个公网的IP地址(虽然有的机构可以用局域网IP地址颁发证书,但由于局域网IP存在不具有唯一性,所以有一定风险,而且可以容易被仿照&a…

作者头像 李华