由于 js 语言自身问题,在涉及到小数计算的时候很容易出现精度丢失的问题;其原因就是十进制和二进制之间互相转化的时候小数点后的转换可能会出现无限循环的情况,由于存储结构中的尾数最多只能表示 53 位,这时候会做类似四舍五入的操作,于是精度也就丢失了;
在 javascript 语言中,我们经常会遇到金额、比例的计算,所以需要在计算的时候进行特殊处理;
1、保留几位小数(toFixed)
如果只是一些普通的数字展示,
let a = (100*0.00085).toFixed(12)
console.log(a) //0.085000000000
console.log(parseFloat(a)) //0.085
由于 toFixed 转化后是字符串类型,想要去掉后面无用的 0 ,需要转化为 数字类型(Number、parseFloat);这种情况在大部分情况是可以满足的,但是遇到极端情况:比如说
2、将小数转为整数
由于整数计算不会出现精度丢失的问题,所以可以先将小数转化为整数,计算完之后在转化为小数;
function count(num1, num2, symbol){
let str1 = mun1.toString();
let str2 = num.toString();
let result, len1, len2, step;
try{len1 = str1.split('.')[1].length}catch(e){len1 = 0}
try{len2 = str2.split('.')[1].length}catch(e){len2 = 0}
step = math.pow(10, Math.max(len1, len2))
switch(symbol){
case '+':
result = (num1*step + mun2*step) / step
break;
case "-":
result= (num1*step-num2*step)/step
break;
case "*":
result= ((num1*step)*(num2*step)) / step/step
break;
case "/":
result= (num1*step)/(num2*step)
break;
default:
break;
}
return result;
}
3、第三方库
直接使用第三方库 :根据自己的喜好选择
bignumber.js
decimal.js
big.js
math.js ;