一、问题内容

在码牌支付过程中,输入支付金额为19.9元时,后端保存的却是19.89元

二、问题原因

由于js在进行一个浮点数与任何Number数据运算时,可能会产生精度不准确的问题

问题代码:

1
temp1.tradeFee = parseInt(Fee*100);  //Fee为金额

浏览器在执行19.9*100时得到的结果是1989.9999999999998,会存在0.0000000002的误差,再通过parseInt方法取整后就造成了结果为1989

image-20220415211052591

三、解决方案

由于浮点型直接计算可能会出问题,所以可以将其先转为整型计算,乘法先去掉小数点,先转为整数乘法,然后再将结果缩小n倍

image-20220415211934384

1
2
//调用
temp1.tradeFee = parseInt(numMulti(Fee,100));

四、分析

个别数字精度丢失原因:因为计算机是采用二进制存取数据,有些浮点数二进制之后就成为无限不循环小数了,但是浮点数的小数部分最多支持 52 位,超过就自动舍入计算了,然后就会有精度损失问题