export const floatObj = function () {
//加法
function add(a,b){
return math.number(math.add(math.bignumber(a), math.bignumber(b)))
}
//减法
function subtract(a,b){
return math.number(math.subtract(math.bignumber(a), math.bignumber(b)))
}
// 乘法
function multiply(a,b){
return math.number(math.multiply(math.bignumber(a), math.bignumber(b)))
}
// 除法
function divide(a,b){
let num
a==0||b==0? num = 0 : num = math.number(math.divide(math.bignumber(a), math.bignumber(b)))
return num
}
//四舍五入并保留n位小数(isRound是否四舍五入)
function fomatFloat(num,n,isRound){
var f = parseFloat(num)
if(isNaN(f)){
return false
}
f = Math.round(num*Math.pow(10, isRound?n:n+1))/Math.pow(10, isRound?n:n+1) // n 幂
var s = f.toString()
var rs = s.indexOf('.')
//判定如果是整数,增加小数点再补0
if(rs < 0){
rs = s.length
s += '.'
}
while(s.length <= rs + n){
s += '0'
}
let _s = s.split(".")[0] + '.' + (s.split(".")[1].substr(0,n))
return Number(isRound?s:_s)
}
return {
add: add,
subtract: subtract,
multiply: multiply,
divide: divide,
fomatFloat
}
}()
如:0.1+0.2 !== 0.3;0.1*0.2 !== 0.03
如:9999999999999999 === 10000000000000001
如:1.335.toFixed(2) // 1.33;1.336.toFixed(2) // 1.34
二进制模仿十进制进行四舍五入,而二进制只有0和1,于是就0舍1入,于是就导致了小数计算不精确。大数的精度丢失本质上是和小数一样,js中表示最大的数是Math.pow(2, 53),十进制即 9007199254740992;大于该数的值可能会丢失精度。
小数的话,一般转成整数进行计算,然后对结果做除法;同样也可以直接对结果进行4舍5入;
对于大数出现的问题概率较低,毕竟还要运算结果不超过最大数就不会丢失精度;
javaScript数字精度丢失问题总结
js中精度问题以及解决方案
JavaScript 中精度问题以及解决方案