JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js

249 篇文章 24 订阅
订阅专栏
20 篇文章 0 订阅
订阅专栏
文章详细介绍了JavaScript中由于使用IEEE-754标准导致的浮点数计算精度问题,并提供了多种解决方法,包括扩大倍数、toFixed、mathjs库、bignumber.js、big.js和decimal.js等,最后推荐了a-calc包作为计算工具。
摘要由CSDN通过智能技术生成

一、计算精度现象举例

举例1、加法

举例2、减法 

 

举例3、乘法

举例3、除法

二、JS为什么会有计算精度的问题

JavaScript 内部只有一种数字类型Number,也就是说,JavaScript 语言的底层根本没有整数,所有数字都是以IEEE-754标准格式64位浮点数形式储存,1与1.0是相同的。因为有些小数以二进制表示位数是无穷的。JavaScript会把超出53位之后的二进制舍弃,所以涉及小数的比较和运算要特别小心。

IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。

三、解决方法

项目技术栈vue3+vite+ts

3.1、方法一,同时扩大倍数再除以相同的倍数

(x * 10 ^ n + y * 10 ^ n)/ 10 ^ n

0.1 +0.2
// 0.30000000000000004
(0.1 *10 + 0.2 *10) / 10
// 0.3

3.2、方法二,toFixed保留小数位数,依然存在精度问题

3.3、方法三,mathjs - npm

pnpm add mathjs

Weekly Download 580197 (20230324) 

方法运算使用运输结果

add

加法

add(1, 2)

3

subtract

减法

subtract(2, 1)

1

multiply

乘法

multiply(2, 2)

4

divide

除法

divide(4, 2)

2

round

四舍五入

round(4.01)

4

bignumber

转换为bigNumber类型。对于具有任意精度的计算,math.js支持BigNumber数据类型,bignumber返回一个Decimal类,精度依然难以保证

bignumber(4.01)

evaluate

直接运算表达式

evaluate('(4.01 + 3) / 2')

3.505

sqrt

平方根计算

sqrt(4)

2

pow

x 的 y 次幂值pow(3,3)27

chain

链式操作

chain(3).add(4).multiply(2).done()

14

atan2

返回其参数商的反正切值

atan2(15,30)

0.4636476090008061
log返回给定数字的自然Log值(即e的底数)

log(9)

2.1972245773362196

pi

圆周率

console.log('pi:', pi)

3.141592653589793
e欧拉常数和自然对数的基数,约为 2.718

console.log('e:', e)

2.718281828459045

derivative

待考证

console.log('derivative:',derivative('x^2 + x', 'x'))

matrix

矩阵操作

matrix([0, 1, 2,  3, 4])

3.4、方法四, bignumber.js - npm

Weekly Download 8826960 (20230324) 

pnpm add bignumber.js

const num = new BigNumber(1234567890.0123456789)

const num1 = new BigNumber(123.123)

方法运算使用运算结果

toFormat

格式化

num.toFormat()

1,234,567,890.0123458 保留了七位小数,第七位依据第八位四舍五入

toFormat

格式化

num.toFormat(3)

1,234,567,890.012 保留三位小数

toFormat

格式化

num.toFormat(13)

1,234,567,890.012 保留十三位小数,实际还是保留了七位小数,第七位依据第八位四舍五入,然后位数用0补足

plus

加法

num1.plus(1.1)

minus

减法

num1.minus(1.1)

times

乘法

num1.times(2)

div

除法

num1.div(2)

mod

取余

num1.mod(2)

x.eq(y)

isEqualTo--是否相等

num.eq(num1)

false

x.gt(y)

isGreaterThan--是否大于

num.gt(num1)

true

x.gte(y)

isGreaterThanOrEqualTo--是否大于等于

num.gte(num1)

true

x.lt(y)

isLessThan--是否小于

num.lt(num1)

false

x.lte(y)

isLessThanOrEqualTo--是否小于等于

num.lte(num1)

false

negated

取非,改变数字的正负号

num.negated()

3.5、方法五, big.js - npm

Weekly Download 21,339,420 (20230324) 

pnpm add @types/big.js

const num = new Big(1234567890.0123456789)

const num1 = new Big(123.123)

方法运算使用运算结果

plus

加法

num1.plus(1.1)

minus

减法

num1.minus(1.1)

times

乘法

num1.times(2)

div

除法

num1.div(2)

mod

取余

num1.mod(2)

x.eq(y)

isEqualTo--是否相等

num.eq(num1)

false

x.gt(y)

isGreaterThan--是否大于

num.gt(num1)

true

x.gte(y)

isGreaterThanOrEqualTo--是否大于等于

num.gte(num1)

true

x.lt(y)

isLessThan--是否小于

num.lt(num1)

false

x.lte(y)

isLessThanOrEqualTo--是否小于等于

num.lte(num1)

false

3.6、方法六, decimal.js - npm

Weekly Download 16,251,713 (20230324) 

pnpm add decimal.js

 const num = new Big(1234567890.0123456789)

const num1 = new Big(123.123)

方法运算使用运算结果

plus

加法

num1.plus(new Decimal(1.1))

minus

减法

num1.minus(new Decimal(1.1))

times

乘法

num1.times(new Decimal(2))

div

除法

num1.div(new Decimal(2))

mod

取余

num1.mod(new Decimal(2))

x.eq(y)

isEqualTo--是否相等

num.eq(num1)

false

x.gt(y)

isGreaterThan--是否大于

num.gt(num1)

true

x.gte(y)

isGreaterThanOrEqualTo--是否大于等于

num.gte(num1)

true

x.lt(y)

isLessThan--是否小于

num.lt(num1)

false

x.lte(y)

isLessThanOrEqualTo--是否小于等于

num.lte(num1)

false

3.7、方法七、a-calc / 推荐使用

pnpm add a-calc

a-calc是一个用于计算数学表达式的npm包。它可以处理基本的算术操作(如加法、减法、乘法和除法),并支持使用括号来控制运算顺序。除此之外,a-calc还提供了一些常用的数学函数,如平方根、求幂和取模运算。

使用a-calc非常简单。你只需要引入a-calc包,然后通过调用其提供的方法来进行计算。例如,你可以使用a-calc的add方法来计算两个数的和,使用multiply方法来计算两个数的乘积。

除了这些基本的操作,a-calc还提供了evaluate方法,可以用于计算复杂的数学表达式。你只需要将你的数学表达式作为参数传递给evaluate方法,它会返回计算结果。

总的来说,a-calc是一个方便易用的npm包,适用于在JavaScript项目中进行数学计算。无论是简单的算术运算还是复杂的数学表达式,a-calc都可以帮助你轻松地进行计算。

JavaScript:a-calc解决前端精度问题-CSDN博客

四、欢迎交流指正,关注我,一起学习。

参考链接:

JavaScript Math 参考手册

使用big.js处理计算精度问题
weixin_47346395的博客
11-22 1261
使用big.js处理计算进度问题 import Big from "big.js"; export const pint = { // 除法 division(a = 0, b = 0) { return new Big(a).div(b).toNumber(); }, // 加法 add(a = 0, b = 0) { return new Big(a).plus(b).toNumber(); }, // 乘法 multip(a = 0, b = 0).
js计算精度问题解决方案
08-09
js精度,js浮点数,js浮点数计算,js计算精度问题解决方案,js保留小数位,
decimal.js-light:decimal.js 的轻量版本,JavaScript 的任意精度 Decimal 类型
07-24
的轻量版本, 的任意精度 Decimal 类型。 这个库是最新的库家族: 、 、 和decimal.js-light 。 该 API 或多或少是decimal.js的 API 的一个子集。 这个库和decimal.js之间的差异 缩小后的decimal.js 的大小:32.1 KB。 decimal.js-light缩小后的大小:12.7 KB。 该库不包括NaN 、 Infinity或-0作为合法值,也不使用其他基数中的值。 在这里, Decimal.round属性只是toDecimalPlaces 、 toExponential 、 toFixed 、 toPrecision和toSignificantDigits的默认舍入模式。 它不适用于算术运算,它们只是在所需的精度下被截断。 如果需要舍入,只需明确应用它,例如 x = new Decimal ( 2 ) ; y
探索数学的无限可能:Math.js 开源库全面解析
最新发布
gitblog_00347的博客
08-09 280
探索数学的无限可能:Math.js 开源库全面解析 mathjsAn extensive math library for JavaScript and Node.js项目地址:https://gitcode.com/gh_mirrors/ma/mathjs 在现代编程领域,数学计算是不可或缺的一部分。无论是科学研究、工程设计还是日常的数据处理,一个强大且灵活的数学库都能极大地提升开发效率和计算...
js小数相加、相乘失去精度问题解析详解(最优方案)
js_admin的博客
07-22 9443
我们得到后台返回的float类型的数字,用来相加、相乘失去精度,得到小数点显示很多位,为了这个问题,小编找到一个最优方法,贡献给大家参考。 var CMX = CMX || {}; /** ** 加 **/ CMX.add = function (arg1, arg2) { var r1, r2, m, c; try { r1 = arg1.toString().split(
js如何解决计算精度问题
zm8454的博客
05-23 5063
保留小数位数:在进行小数计算时,可以通过toFixed()方法保留需要的小数位数,但要注意该方法返回的结果为字符串类型,需要使用parseFloat()方法将其转换为数字类型。完成计算后再将结果除以相应的倍数,得到最终结果。使用第三方库:JavaScript中有许多优秀的第三方库,例如Decimal.jsBig.js等,这些库可以用来处理浮点数和小数的计算精度问题。使用Math库的函数:例如round()、floor()、ceil()、abs()等函数,这些函数可以用来处理浮点数和小数的计算精度问题
解决js计算精度问题
Lora_0925的博客
02-09 749
// 除以 accDiv(arg1, arg2) { let t1 = 0, t2 = 0, r1, r2; try { t1 = arg1.toString().split(".")[1].length } catch (e) {} try { t2 = arg2.toString().split(".")[1].length } catch (e) {}; r1 = Number(arg1.toString().repla...
关于javaScript计算精度解决办法
weixin_54205973的博客
03-21 1826
项目中我们常常需要做一些计算,由于浮点数的二进制表示可能不精确,经常会遇到计算精度问题,例这个时候,如果我们不单独处理,那么页面上展示的时候就出现布局错乱等问题,比如我们可以保留两位小数采用Number(resultNum).toFixed(2),但是部分时候精度又达不到我们的要求。所以以下我做了几种解决计算的方法,亲测有效。
js - 计算精度问题
sodakii的博客
04-22 693
JavaScript 中的浮点数丢失精度问题是由底层表示方式引起的,因此在进行重要的精确计算时需要格外小心。选择合适的方法,如整数计算、使用专门的库或小数点后截断,可以帮助我们在实际应用中处理这些问题,确保得到精确的结果。在不同场景中选择适当的方法,是程序员需要谨慎考虑的问题,以避免潜在的错误。
关于JavaScript计算精度丢失的问题(一)
iteye_10226的博客
01-22 537
摘要: 由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JavaScript中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失。 为了避免产生精度差异,把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂),这是大部分编程语言处理精度差异的通用方法。 关键词: 计算精度 四舍五入 四则运算 精度丢失 1. 疑...
js计算精度问题
SongGuoQ的博客
08-19 483
解决js计算精度问题
js计算精度问题小结
12-08
代码如下://问题比如:7*0.8 JavaScript算出来就是:5.6000000000000005             //加法函数,用来得到精确的加法结果            //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。            //调用:accAdd(arg1,arg2)            //返回值:arg1加上arg2的精确结果            function accAdd(arg1, arg2) {                var r1, r2, m;         
javascript 精度问题解决方案
zhengyingjun的博客
06-19 1448
在写项目时,客户反应这样一个问题js台代码进行乘法运算,会出现问题,    以下为解决办法 程序代码 //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 //调用:accDiv(arg1,arg2) //返回值:arg1除以arg2的精确结果 function accDiv(...
js加减乘除运算时失去精度问题解决方法
付凯
05-25 3362
加法:/**       * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。       *       * @param num1加数1 | num2加数2       */      function numAdd(num1, num2) {          var baseNum, baseNum1, baseNum2;          try {              b...
js解决数字小数计算出现的精度丢失问题(2024-05-24)
hap1994的博客
05-24 1188
js小数进行数值运算时出现精度丢失问题JavaScript 的number类型在进行运算时都先将十进制转二进制,此时,小数点后面的数字转二进制时会出现无限循环的问题。为了避免这一个情况,要舍0进1,此时就会导致精度丢失问题
JS数字计算精度误差解决方法
GFox-鬼狐
12-07 3685
转自:http://www.jb51.net/article/47659.htm 表现: var numA = 0.1; var numB = 0.2; alert( (numA + numB) === 0.3 ); //执行结果是 false 为什么不是 true? alert( numA + numB ); // 执行结果是 0.30000000000000004 为什么不是 0....
一篇文章带您了解如何高效解决JavaScript计算精度出现误差的问题
Yu的博客
04-07 2583
如何高效解决JavaScript计算精度出现误差的问题
js处理精度问题
qq_36411712的博客
07-31 298
首先要明白计算机不会进行我们正常生活中的数学运算, 如1/3+1/3+1/3 = 1; 只会把它转为二进制进行运算, 最终变为:0.333...+0.333...+0.333...=0.999...; 而不是等于1, 这时我们就要用,tofix(),方法转位多少位字符串小数, 再用pasreFloat(),转位数字类型; parseFloat((0.2+0.145).toFixed(3)) 或者直接把你想计算多少位的小数直接乘以10的多少次方进行计算; ...
JS精度计算的几种解决方法,1、转换成整数计算后再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js
weixin_44434938的博客
03-19 541
JS精度计算的几种解决方法,1、转换成整数计算后再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js
关于JS中使用JSON.parse长整型数丢失精度的问题解决
05-25
JavaScript 中,标准的数字类型是双精度浮点数,它的精度最多只有 53 位。当我们使用 JSON.parse 解析 JSON 数据时,如果数据中包含超过 53 位的数字,那么这些数字就会丢失精度,导致错误的结果。 解决问题的方法可以是: 1.使用第三方库,如 bignumber.jsdecimal.js 等来处理长整型数。 2.将长整型数转换为字符串,然后再进行 JSON.parse 解析,这样可以保证数值的精度不会丢失。 比如,可以使用以下代码来将 JSON 数据中的所有数值都转换为字符串: ```javascript function parseJSONWithBigInt(jsonStr) { return JSON.parse(jsonStr, (key, value) => { if (typeof value === 'string') { try { return BigInt(value); } catch (e) { // do nothing } } return value; }); } ``` 使用该函数来解析 JSON 数据: ```javascript const jsonStr = '{"value": 12345678901234567890}'; const data = parseJSONWithBigInt(jsonStr); console.log(data.value); // 12345678901234567890n ``` 这样就可以得到正确的结果了,其中 `12345678901234567890n` 表示一个 BigInt 类型的数值。
写文章

热门文章

  • pnpm:基础使用 67234
  • 小程序:微信扫码,携带参数跳转到小程序指定页面 43219
  • vue3+vite:本地代理,配置proxy 36366
  • github:网址为 https://github.com/ 的网页可能暂时无法连接,或者它已永久性地移动到了新网址 32276
  • 小程序:uniapp解决 vendor.js 体积过大的问题 29639

分类专栏

  • 前端 249篇
  • nodejs 8篇
  • 供应链管理 17篇
  • 小程序 16篇
  • Java 4篇
  • 网络 6篇
  • 数据库 3篇
  • WebGL 3篇
  • 浏览器 2篇

最新评论

  • JavaScript:事件循环机制(EventLoop)

    higboys: 同样迷惑在这

  • JavaScript:事件循环机制(EventLoop)

    周隆武: 第三个代码说.then是异步执行,第四个代码又说.then是同步执行,这是咋回事?

  • Tailwind CSS:基础使用/vue3+ts+Tailwind

    snowball_li: 再试试,本人已用在两个项目,应该可以

  • Tailwind CSS:基础使用/vue3+ts+Tailwind

    snowball_li: 按照步骤再试试,本人已用在两个项目,应该可以

  • Tailwind CSS:基础使用/vue3+ts+Tailwind

    对方已将你移除!: 不生效

最新文章

  • vue3 + ts + pnpm:nprogress / 页面顶部进度条
  • AI问答-HTTP:理解 Content-Disposition
  • AI问答-Vue实例属性/实例方法:$refs、$emit、$attrs、$props、$data...
2024
09月 5篇
08月 18篇
07月 9篇
06月 7篇
05月 8篇
04月 2篇
03月 3篇
01月 1篇
2023年122篇
2022年64篇
2021年45篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司大兴区互联网网站优化记录浙江省网站优化厂家网站优化简称泰州个人网站优化抖音优化网站跨境电商平台如何优化网站seo网站优化好学吗龙岗网站推广优化瓷砖网站优化学习网站seo优化诊断方案北京网站整站优化网站优化评分嘉祥县谷歌网站优化网站优化挖掘精准词唐山路南网站优化价格深圳网站产品优化网站优化效果检测怎么写武穴网站优化推广公司巩义网站排名优化怎么选网站优化推广专业公司优化网站分手工优化吗网站标题对优化的影响优化提升网站权重均安网站优化入门黑河怎么做网站优化合肥优化网站即墨网站优化哪家专业网站优化课程故事夏天新乡企业网站优化系统内蒙古外贸网站优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化