zl程序教程

您现在的位置是:首页 >  后端

当前栏目

js加减乘除丢失精度问题解决方法

JS方法 问题 解决 丢失 精度 加减乘除
2023-06-13 09:15:26 时间
在javascript中,当你使用小数进行加减乘除运算时,你会发现,所得到的结果有时后面带有长长的一段小数,使运算变得复杂,并且影响计算结果。上网查询了一下原因,大致如下:在javascript中,带小数的数据运算时总会出现好多位小数.这是因为在javascript中浮点数的计算是以2进制计算的。
复制代码代码如下:

/**
*加法运算,避免数据相加小数点后产生多位数和计算精度损失。
*
*@paramnum1加数1|num2加数2
*/
functionnumAdd(num1,num2){
varbaseNum,baseNum1,baseNum2;
try{
baseNum1=num1.toString().split(".")[1].length;
}catch(e){
baseNum1=0;
}
try{
baseNum2=num2.toString().split(".")[1].length;
}catch(e){
baseNum2=0;
}
baseNum=Math.pow(10,Math.max(baseNum1,baseNum2));
return(num1*baseNum+num2*baseNum)/baseNum;
};
/**
*加法运算,避免数据相减小数点后产生多位数和计算精度损失。
*
*@paramnum1被减数|num2减数
*/
functionnumSub(num1,num2){
varbaseNum,baseNum1,baseNum2;
varprecision;//精度
try{
baseNum1=num1.toString().split(".")[1].length;
}catch(e){
baseNum1=0;
}
try{
baseNum2=num2.toString().split(".")[1].length;
}catch(e){
baseNum2=0;
}
baseNum=Math.pow(10,Math.max(baseNum1,baseNum2));
precision=(baseNum1>=baseNum2)?baseNum1:baseNum2;
return((num1*baseNum-num2*baseNum)/baseNum).toFixed(precision);
};
/**
*乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。
*
*@paramnum1被乘数|num2乘数
*/
functionnumMulti(num1,num2){
varbaseNum=0;
try{
baseNum+=num1.toString().split(".")[1].length;
}catch(e){
}
try{
baseNum+=num2.toString().split(".")[1].length;
}catch(e){
}
returnNumber(num1.toString().replace(".",""))*Number(num2.toString().replace(".",""))/Math.pow(10,baseNum);
};
/**
*除法运算,避免数据相除小数点后产生多位数和计算精度损失。
*
*@paramnum1被除数|num2除数
*/
functionnumDiv(num1,num2){
varbaseNum1=0,baseNum2=0;
varbaseNum3,baseNum4;
try{
baseNum1=num1.toString().split(".")[1].length;
}catch(e){
baseNum1=0;
}
try{
baseNum2=num2.toString().split(".")[1].length;
}catch(e){
baseNum2=0;
}
with(Math){
baseNum3=Number(num1.toString().replace(".",""));
baseNum4=Number(num2.toString().replace(".",""));
return(baseNum3/baseNum4)*pow(10,baseNum2-baseNum1);
}
};