js 计算精度问题以及科学计数法问题
Javascript数字计算不准确的问题,一不注意就容易对我们的项目产生或大或小的影响。
所以我们需要了解下Javascript计算精度问题产生的原因 及一些解决办法。
原理
一个数字以二进制的形式存储在内存中,是一个只有 1 和 0 的序列。在十进制数字系统中虽然看起来很简单,但0.1
,0.2
这样的小数,实际上在二进制形式中是无限循环小数。
解决方法
1.bignumber.js
BigNumber.js是一个用于任意精度计算的js库。大概原理是将所有数字当做字符串,重新实现了计算逻辑。缺点是性能比原生的差很多。
安装方法
//安装
npm install bignumber.js --save
//引入
import BigNumber from 'bignumber.js'
放几个常用的方法,详细的文档里有。
// 转为 bignumber const x= new BigNumber('0.1'); // 转为 普通数字 x.toNumber() // 计算 x.plus(0.1) // 加法 x.minus(0.1) // 减法 x.times(0.1) // 乘法 x.dividedBy(0.1) // 除法
源码地址:https://github.com/MikeMcl/bignumber.js/releases
api文档:https://mikemcl.github.io/bignumber.js/
2.科学计数法转数字
有时会遇到科学计数法的情况,需要转成常规数字。
// 科学计数法转数字 toNonExponential(num) { var m = num.toExponential().match(/\d(?:.(\d*))?e([+-]\d+)/); return num.toFixed(Math.max(0, (m[1] || "").length - m[2])); },
道阻且长,行则将至!