前端如何应对精确数字运算?用BigNumber.js解决JavaScript原生Number类型在处理大数或高精度计算时的局限性

前端如何应对精确数字运算?用BigNumber.js解决JavaScript原生Number类型在处理大数或高精度计算时的局限性

目录

前端如何应对精确数字运算?用BigNumber.js解决JavaScript原生Number类型在处理大数或高精度计算时的局限性

一、BigNumber.js介绍

1、什么是 BigNumber.js?

2、作用领域

3、核心特性

二、安装配置与基础用法

1、引入 BigNumber.js

2、配置 BigNumber.js

3、常用方法

①创建 BigNumber 实例

②基本运算

③幂运算

④绝对值

⑤舍入

⑥比较

⑦格式化输出

⑧链式调用

三、核心特性

1、大数精度丢失问题

2、小数运算精度问题

3、大数乘除法精度问题

四、总结


        作者:watermelo37

        ZEEKLOG万粉博主、华为云云享专家、阿里云专家博主、腾讯云、支付宝合作作者,全平台博客昵称watermelo37。

        一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。



---------------------------------------------------------------------

温柔地对待温柔的人,包容的三观就是最大的温柔。

---------------------------------------------------------------------

前端如何应对精确数字运算?用BigNumber.js解决JavaScript原生Number类型在处理大数或高精度计算时的局限性

一、BigNumber.js介绍

1、什么是 BigNumber.js?

        BigNumber.js 是一个 JavaScript 库,用于处理高精度的数字运算。它解决了 JavaScript 原生 Number 类型在处理大数或高精度计算时的局限性。由于 JavaScript 的 Number 类型基于 IEEE 754 标准(双精度浮点数),其精度限制为 53 位有效数字,因此在处理大数或需要高精度的场景下容易出现精度丢失的问题。

        BigNumber.js专注于十进制精度运算,内部使用字符串进行十进制模拟,完全避免了 JS 的二进制浮点误差。默认不会丢失精度,也不会四舍五入除非你手动指定。在很多真实应用场景中(如金融、金额、电商)至关重要。

// 精度计算问题 console.log(0.1+0.2); // 0.30000000000000004 // 大数比较问题,超过2^53 - 1 = 9007199254740991的数字会丢失精度 console.log(15615616981519815 === 15615616981519816)

2、作用领域

        BigNumber.js 的主要作用领域包括但不限于以下场景:

  • 金融计算:贷款利息计算、汇率转换、交易金额处理等。
  • 科学计算:天文学中的距离计算、化学中的分子量计算等。
  • 区块链与加密货币:比特币、以太坊等加密货币的交易金额等。
  • 数据统计与分析:统计报表、数据分析工具等。
  • 其他高精度需求场景:游戏开发中的经济系统(虚拟货币)、电子商务中的价格计算等。

3、核心特性

        BigNumber.js 的核心特性使其成为处理高精度数字的理想选择:能支持任意精度;每次操作都会返回一个新的BigNumber对象,不修改原始对象;支持丰富的数学运算;支持多种格式化输出方式;配置灵活且跨平台兼容。

二、安装配置与基础用法

1、引入 BigNumber.js

        通过npm安装:

npm install bignumber.js

        然后在代码中引入:

const BigNumber = require('bignumber.js'); // 或者(ES6 模块语法) import BigNumber from 'bignumber.js';

        如果不想使用 npm,可以直接通过 CDN 在 HTML 文件中引入:

<script src="https://cdn.jsdelivr.net/npm/bignumber.js/bignumber.min.js"></script> <script> // 使用全局变量 BigNumber const num = new BigNumber('123456789.123456789'); console.log(num.toString()); </script>

2、配置 BigNumber.js

        BigNumber.js 提供了全局配置选项,可以设置默认精度、舍入模式等。这些配置对所有 BigNumber 实例生效。

BigNumber.config({ DECIMAL_PLACES: 10, // 设置小数点后保留位数 ROUNDING_MODE: BigNumber.ROUND_HALF_UP, // 四舍五入 EXPONENTIAL_AT: [-15, 20], // 设置科学计数法的触发范围 });
  • DECIMAL_PLACES:控制小数点后的保留位数。
  • ROUNDING_MODE:定义舍入模式,支持以下选项:
    • BigNumber.ROUND_UP:向上取整。
    • BigNumber.ROUND_DOWN:向下取整。
    • BigNumber.ROUND_HALF_UP:四舍五入。
    • BigNumber.ROUND_HALF_DOWN:五舍六入。
  • EXPONENTIAL_AT :设置科学计数法的触发范围。例如,[-15, 20] 表示当数字小于 1e-15 或大于 1e20 时,会自动转换为科学计数法。

        你也可以在创建 BigNumber 实例时用局部配置代替全局配置:

const num = new BigNumber('1.23456789', { DECIMAL_PLACES: 5 }); console.log(num.toString()); // 输出:1.23457

3、常用方法

        以下是一些常用的 BigNumber.js 方法及其用途:

①创建 BigNumber 实例
const num = new BigNumber('123456789.123456789'); console.log(num.toString()); // 输出:123456789.123456789
基本运算

        BigNumber.js 支持加法、减法、乘法、除法、取模等操作。

const a = new BigNumber('10'); const b = new BigNumber('3'); console.log(a.plus(b).toString()); // 加法:13 console.log(a.minus(b).toString()); // 减法:7 console.log(a.times(b).toString()); // 乘法:30 console.log(a.div(b).toString()); // 除法:3.3333333333333333333 console.log(a.mod(b).toString()); // 取模:1
③幂运算
const num = new BigNumber('2'); console.log(num.pow(10).toString()); // 幂运算:1024
④绝对值
const num = new BigNumber('-123.45'); console.log(num.abs().toString()); // 绝对值:123.45
⑤舍入
const num = new BigNumber('1.23456789'); console.log(num.toFixed(2, BigNumber.ROUND_UP)); // 向上取整:1.24 console.log(num.toFixed(2, BigNumber.ROUND_DOWN)); // 向下取整:1.23 console.log(num.toFixed(2, BigNumber.ROUND_HALF_UP)); // 四舍五入:1.23
⑥比较
const a = new BigNumber('10'); const b = new BigNumber('20'); console.log(a.comparedTo(b)); // 比较:-1(a < b) console.log(a.isEqualTo(b)); // 判断是否相等:false console.log(a.isGreaterThan(b)); // 判断是否大于:false console.log(a.isLessThan(b)); // 判断是否小于:true
⑦格式化输出
const num = new BigNumber('123456789.123456789'); console.log(num.toString()); // 默认格式:123456789.123456789 console.log(num.toFormat(2)); // 格式化为两位小数:123,456,789.12 console.log(num.toExponential(2)); // 科学计数法:1.23e+8
⑧链式调用
const result = new BigNumber('10') .plus('5') // 10 + 5 = 15 .times('2') // 15 * 2 = 30 .div('3') // 30 / 3 = 10 .pow('2'); // 10^2 = 100 console.log(result.toString()); // 输出:100

三、核心特性

1、大数精度丢失问题

        JavaScript 原生 Number 类型在处理非常大的数字或小数时会出现精度丢失,而 BigNumber.js 能确保任意精度。

// 原生 JavaScript console.log(9007199254740992 === 9007199254740993); // 输出:true(错误) // 使用 BigNumber.js const BigNumber = require('bignumber.js'); const num1 = new BigNumber('9007199254740992'); const num2 = new BigNumber('9007199254740993'); console.log(num1.eq(num2)); // 输出:false(正确)

2、小数运算精度问题

        原生 JavaScript 在处理小数运算时可能会出现浮点数精度误差,而 BigNumber.js 能确保精确结果。

// 原生 JavaScript console.log(0.1 + 0.2); // 输出:0.30000000000000004(错误) // 使用 BigNumber.js const BigNumber = require('bignumber.js'); const num1 = new BigNumber('0.1'); const num2 = new BigNumber('0.2'); console.log(num1.plus(num2).toString()); // 输出:0.3(正确)

3、大数乘除法精度问题

        原生 JavaScript 在处理大数乘/除法时可能会丢失精度,而 BigNumber.js 能确保精确结果。

// 原生 JavaScript const weiAmount = 1000000000000000001; // 1 ETH + 1 wei const ethAmount = weiAmount / 1000000000000000000; console.log(ethAmount); // 输出:1.0000000000000002(错误) // 使用 BigNumber.js const BigNumber = require('bignumber.js'); const weiAmount = new BigNumber('1000000000000000001'); // 1 ETH + 1 wei const ethAmount = weiAmount.div(new BigNumber('1000000000000000000')); console.log(ethAmount.toString()); // 输出:1.000000000000000001(正确)

四、总结

        BigNumber.js 是为了解决 JS 在处理“十进制小数”时精度丢失的问题而生的。相比之下,其他库要么功能更复杂(decimal.js)、要么精度控制不默认(math.js)、要么只处理整数(BigInt)。

        只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

        其他热门文章,请关注:

        极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

        你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

        DeepSeek:全栈开发者视角下的AI革命者

        通过array.filter()实现数组的数据筛选、数据清洗和链式调用

        通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能

        TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

        通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制

        深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

        el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

        MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver

        JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、DOM操作等

        前端实战:基于Vue3与免费满血版DeepSeek实现无限滚动+懒加载+瀑布流模块及优化策略

        高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图

        干货含源码!如何用Java后端操作Docker(命令行篇)

        在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

        Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

Read more

Gemma-3-270m Vue.js前端集成:浏览器端AI应用开发

Gemma-3-270m Vue.js前端集成:浏览器端AI应用开发 1. 为什么要在浏览器里跑AI模型 你有没有想过,当用户打开一个网页,不需要下载App、不用配置环境、甚至不联网也能和AI对话?这听起来像未来科技,但其实已经可以实现了。最近Google发布的Gemma-3-270m模型,只有270M参数,轻量得像一张高清图片,却能在浏览器里完成文本生成、问答、代码辅助等任务。 过去我们总以为AI必须跑在服务器上,前端只是个“花瓶”界面。但现实是,很多场景根本不需要把数据传到云端——比如个人笔记里的智能摘要、设计稿旁的文案建议、学习资料的即时问答。这些需求对响应速度敏感,对隐私要求高,还希望离线可用。 Vue.js作为国内最常用的前端框架之一,生态成熟、上手简单、文档友好,特别适合快速搭建这类轻量AI应用。它不像React那样需要大量配置,也不像Svelte那样学习曲线陡峭,而是用一种“写HTML就能动起来”的直觉方式,让开发者能把精力集中在AI能力本身,而不是框架折腾上。 实际测试中,一个基于Vue的Gemma-3-270m应用,在普通笔记本上首次加载模型约8秒,后续推

全面掌握WebDAV客户端工具:从入门到精通实战指南

全面掌握WebDAV客户端工具:从入门到精通实战指南 【免费下载链接】webdavSimple Go WebDAV server. 项目地址: https://gitcode.com/gh_mirrors/we/webdav WebDAV作为现代远程文件管理的核心技术,能够将远程服务器文件操作变得如同本地操作一样直观便捷。无论您是个人用户还是企业团队,掌握WebDAV客户端工具都能极大提升工作效率。🎯 WebDAV协议的核心价值与应用场景 WebDAV协议基于HTTP/HTTPS构建,提供了超越传统FTP的丰富功能特性。在日常工作中,WebDAV能够完美解决以下痛点: * 跨平台文件同步:在Windows、macOS、Linux系统间无缝传输文件 * 团队协作管理:支持文件锁定功能,避免多人同时编辑冲突 * 远程办公支持:通过互联网安全访问公司内部文件资源 * 移动设备集成:手机平板轻松连接服务器,随时随地访问文档 专业级WebDAV客户端工具深度评测 Windows平台首选工具 RaiDrive - 革命性的网络驱动器映射方案 * 将WebDAV服务

SenseVoice-small WebUI保姆级:Linux服务器防火墙端口开放配置

SenseVoice-small WebUI保姆级:Linux服务器防火墙端口开放配置 1. 引言:为什么需要配置防火墙端口? 想象一下,你刚刚在Linux服务器上成功部署了SenseVoice-small语音识别服务,心情激动地打开浏览器,输入 http://你的服务器IP:7860,结果页面一片空白,或者直接提示“无法访问此网站”。 是不是瞬间感觉像被泼了一盆冷水?别着急,这很可能不是你的部署出了问题,而是服务器的“门卫”——防火墙,把访问请求给拦住了。 今天这篇文章,就是来帮你解决这个问题的。我会用最直白的方式,带你一步步搞定Linux服务器的防火墙端口配置,让你能顺利访问到SenseVoice-small的WebUI界面。无论你是刚接触Linux的新手,还是有一定经验但对防火墙配置不太熟悉的开发者,这篇文章都能帮到你。 我们先来快速了解一下SenseVoice-small是什么。它是一个轻量级的多任务语音模型,专门针对ONNX格式做了量化优化,所以能在手机、平板、嵌入式设备这些资源有限的环境里离线运行。它的WebUI界面设计得很友好,支持上传音频文件或者直接录音,然

C++ 方向 Web 自动化测试入门指南:从概念到 Selenium 实战

C++ 方向 Web 自动化测试入门指南:从概念到 Selenium 实战

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 自动化测试基础:先搞懂"为什么"和"做什么" * 1.1 自动化测试的核心目标:回归测试 * 1.2 自动化测试分类:别把 “不同自动化” 混为一谈 * 1.3 自动化测试金字塔:如何分配测试资源? * 二. Web 自动化测试核心:环境搭建与驱动管理 * 2.1 核心组件原理:三者如何协同工作? * 2.2 环境搭建:3 步搞定依赖安装