javascript中float类型计算的精确度问题

在平时的使用过程中,发现使用float类型在进行计算的时候,有些数字在进行计算后,小数点后面的位数明显变多,并且最后一位不为零,和正常的计算结果产生了误差。首先看一下我的代码。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>求和</title>
		
	</head>
	<body>
		<input type="text" id="add1" value="" />
		<input type="text" id="add2" value="" />
		<input type="button" id="add3" value="add" οnclick="add()"/>
		<script type="text/javascript">
			function add(){
				var a1 = document.getElementById('add1').value;
				var a2 = document.getElementById('add2').value;
				if(isNaN(a1)||isNaN(a2)){
					alert('非法的数据类型')//非法数据类型报错
				}
				else{
					var num = parseFloat(a1)+parseFloat(a2);//相加
					alert(num);	//弹出结果
				}
				
			}
		</script>
	</body>
</html>
运行代码可以发现,有一部分数字的计算是没有问题的,但是当我输入1.1和2.2然后相加的时候发现结果变成了3.30000000003(不知道几个0,随便写了几个)。然后我发现问题后在百度搜索答案。

找到一段解释如下,但是个人觉得解释的不是很好。

(非原创)在JavsScript中,变量在存储时并不区分number和float类型,而是统一按float存储。而javascript使用IEEE 754-2008 标准定义的64bit浮点格式存储number,按照IEEE 754的定义:decimal64对应的整形部分长度为10,小数部分长度为16,所以默认的计算结果为“7.0000000000000001”,如最后一个小数为0,则取1作为有效数字标志。


解决方法:1、在计算结果后限制小数点后的位数,以我的代码为例。

var num = (parseFloat(a1)+parseFloat(a2)).toFixed(5);//保留小数点后五位

2、重写浮点计算的函数

//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
function accAdd(arg1, arg2) {
    var r1, r2, m;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2))
    return (arg1 * m + arg2 * m) / m
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值