0
点赞
收藏
分享

微信扫一扫

js浮点数计算精度问题---输入支付金额为19.9元时,提交却是19.89元

一、问题内容

在码牌支付过程中,输入支付金额为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 位,超过就自动舍入计算了,然后就会有精度损失问题(加减乘除都可能存在问题,最好是自己封装工具类或者引入封装好的公共方法)

举报

相关推荐

01-浮点数精度问题bug

0 条评论