一、问题内容
在码牌支付过程中,输入支付金额为19.9元时,后端保存的却是19.89元
二、问题原因
由于js在进行一个浮点数与任何Number数据运算时,可能会产生精度不准确的问题。
问题代码:
tradeFee = parseInt(Fee*100); //Fee为金额
浏览器在执行19.9*100时得到的结果是1989.9999999999998,会存在0.0000000002的误差,再通过parseInt方法取整后就造成了结果为1989
三、解决方案
由于浮点型直接计算可能会出问题,所以可以将其先转为整型计算,乘法先去掉小数点,先转为整数乘法,然后再将结果缩小n倍
// 解决js数字小数点丢失精度的问题
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);
}
//调用
tradeFee = numMulti(Fee,100);
四、分析
个别数字精度丢失原因:因为计算机是采用二进制存取数据,有些浮点数二进制之后就成为无限不循环小数了,但是浮点数的小数部分最多支持 52 位,超过就自动舍入计算了,然后就会有精度损失问题(加减乘除都可能存在问题,最好是自己封装工具类或者引入封装好的公共方法)