如图:
有个类似的问题,简单的方法都试过了,如*100
完了再/100
,还有toFixed(2)
,都不管用..怎么解决..计算总和代码如下:
//总计
this.totalPrice += this.car[i].num * this.car[i].price
如图:
有个类似的问题,简单的方法都试过了,如*100
完了再/100
,还有toFixed(2)
,都不管用..怎么解决..计算总和代码如下:
//总计
this.totalPrice += this.car[i].num * this.car[i].price
this.totalPrice += this.car[i].num * this.car[i].price
this.totalPrice = this.totalPrice.toFixed(2)
这样不行?
toFixed(2)应该没问题吧? 如果是精度问题最好不要直接操作
/**
* 加法运算,避免数据相加小数点后产生多位数和计算精度损失。
*
* @param num1加数1 | num2加数2
*/
function numAdd(num1, num2) {
var baseNum, 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;
};
/**
* 减法运算,避免数据相减小数点后产生多位数和计算精度损失。
*
* @param num1被减数 | num2减数
*/
function numSub(num1, num2) {
var baseNum, baseNum1, baseNum2;
var precision;// 精度
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);
};
/**
* 乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。
*
* @param num1被乘数 | num2乘数
*/
function numMulti(num1, num2) {
var baseNum = 0;
try {
baseNum += num1.toString().split(".")[1].length;
} catch (e) {
}
try {
baseNum += num2.toString().split(".")[1].length;
} catch (e) {
}
return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
};
/**
* 除法运算,避免数据相除小数点后产生多位数和计算精度损失。
*
* @param num1被除数 | num2除数
*/
function numDiv(num1, num2) {
var baseNum1 = 0, baseNum2 = 0;
var baseNum3, 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);
}
};
这个是 js浮点计算导致的
toFixed和四舍五入相对来说 都是不精确的,
解决方案:
this.totalPrice += this.car[i].num * (this.car[i].price*10的n次方)
(16.56*10000*3)/10000 //这样操作应该是没有问题
注意一定是尽可能大的 n次幂 ,100 肯定是不行的
彻底解决的方案是用‘分’表示金额。
如果不想改,*100 转换成int再进行计算。
最后的结果再除以100不会有问题。
price = 16.56
console.log(parseInt(price * 100) * 3 / 100)
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
2 回答4.7k 阅读✓ 已解决
4 回答4.3k 阅读✓ 已解决
结合了一些大家说的方法,最后是这样解决的:
感谢大家的回答,谢谢各位。
目前看来这算是最简单的方法了,其他方法都或多或少的有些漏洞,还是会运算出小数点。
如果还有更简单精确的办法欢迎回答。