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

这篇具有很好参考价值的文章主要介绍了JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、计算精度现象举例

举例1、加法

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

举例2、减法 

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

举例3、乘法

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

举例3、除法

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

二、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

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

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

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

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)

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

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'))

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

matrix

矩阵操作

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

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

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)

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

minus

减法

num1.minus(1.1)

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

times

乘法

num1.times(2)

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

div

除法

num1.div(2)

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

mod

取余

num1.mod(2)

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

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()

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

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)

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

minus

减法

num1.minus(1.1)

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

times

乘法

num1.times(2)

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

div

除法

num1.div(2)

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

mod

取余

num1.mod(2)

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

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))

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

minus

减法

num1.minus(new Decimal(1.1))

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

times

乘法

num1.times(new Decimal(2))

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

div

除法

num1.div(new Decimal(2))

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

mod

取余

num1.mod(new Decimal(2))

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

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

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

参考链接:

JavaScript Math 参考手册文章来源地址https://www.toymoban.com/news/detail-498322.html

到了这里,关于JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 你知道溥仪登基到现在的详细时间吗?用JS工具js-tool-big-box计算出来

    一般现在距离某个时间过去多久,或者还有多久,短时间的可以口算并且比较笼统,但复杂一些的 就需要一些算法了。今天我们用前端JS工具  js-tool-big-box 算出来吧。 目录 1 笼统时间和详细时间需求  2 溥仪登基时间距离现在的显示 - 以前的时间计算 2.1 安装 js-tool-big-box 工

    2024年04月25日
    浏览(28)
  • JavaScript 浮点数运算的精度问题

    来源:https://zhuanlan.zhihu.com/p/191395766 在 JavaScript 中整数和浮点数都属于  Number  数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此。 所以我们在打印  1.00  这样的浮点数的结果是  1  而非  1.00  。在一些特殊的数值表示中,例如金额,这样看上去有点变

    2024年02月08日
    浏览(44)
  • MyBatis-Plus主键策略(雪花算法16位长度的整型id,解决默认雪花算法生成19位长度id导致JS精度丢失问题)

    js表达的最大整数2的53次方减1,精度丢失后面几位全是0! 如果内置支持不满足你的需求,可实现 IKeyGenerator 接口来进行扩展. 举个栗子 #方式一:使用配置类 #方式二:通过 MybatisPlusPropertiesCustomizer 自定义 #方式一: XML 配置 #方式二:注解配置 官方示例 官方id generator示例 htt

    2023年04月08日
    浏览(40)
  • js精度丢失的问题

    1.js精度丢失的常见问题,从常见的浮点型进行计算,到位数很长的munber类型进行计算都会造成精度丢失的问题, 首先我们看一个问题: 那么js为什么会出现精度丢失的问题: 计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1

    2024年02月14日
    浏览(50)
  • JS小数运算精度丢失的问题

    工作中会不会经常会碰到一些数据指标的计算,比如百分比转化,保留几位小数等,就会出现计算不准确,数据精度丢失的情况。通过这篇分享借助第三方库能够轻松解决数据精度丢失的问题。 JS数字精度丢失的一些常见问题 为什么0.1 + 0.2 === 0.3是false呢? 先看下面这个比喻

    2024年02月08日
    浏览(52)
  • js浮点数四则运算精度丢失以及toFixed()精度丢失解决方法

    1、四则运算精度丢失: 2、toFixed() 四舍五入精度丢失: js采用64位浮点数表示法(几乎所有现代编程语言所采用),这是一种二进制表示法。二进制浮点数表示法并不能精确表示类似 0.1 这样简单的数字。 这个问题不只在js中才会出现,在任何使用二进制浮点数的编程语言中

    2024年02月05日
    浏览(46)
  • SpringBoot后端Long数据传到前端js精度损失问题

    在对应的字段上添加注解,将 Long 转为 String 后传输。 在 js 对应的结果接收上使用 BigInt 。

    2024年02月19日
    浏览(51)
  • java中计算缺失精度的问题

    Java中计算会缺失精度的主要原因是浮点数的精度问题和整数溢出问题。 浮点数的精度 Java中的浮点数类型为float和double,它们采用的是IEEE 754规范的浮点数编码,这种编码方式虽然能够表示大范围的实数,但存在一定的精度损失。例如,浮点数在进行加减乘除等运算时,精度

    2024年02月13日
    浏览(48)
  • js 小数相乘后,精度缺失问题,记录四舍五入,向下取整

    在做项目的时候,有一个计算金额的,结果发现计算的金额总是缺失0.01,发现相乘的时候,会失去精度,如图所示。被这整的吐血,由于计算逻辑由前端计算,所以传值后端总出错(尽量后端计算)。 还发现toFixed也会失去进度,简单来说原因:算法不一样,叫说“银行家算法

    2024年02月07日
    浏览(41)
  • 【教程】npm的时候ssh报错ssh://git@github.com/frozeman/bignumber.js-nolookahead.git

    fisco@ubuntu:~/fisco/benchmarks$ npm install install web3@0.20.7 npm ERR! code 128 npm ERR! An unknown git error occurred npm ERR! command git --no-replace-objects ls-remote ssh://git@github.com/frozeman/bignumber.js-nolookahead.git npm ERR! git@github.com: Permission denied (publickey). npm ERR! fatal: Could not read from remote repository. npm ERR!  npm E

    2024年01月23日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包