javascript中float类型计算的精确度问题
html里的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 = ElementById('add1').value;
var a2 = ElementById('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 = String().split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = String().split(".")[1].length } catch (e) { r2 = 0 }
m = Math.pow(10, Math.max(r1, r2))
return (arg1 * m + arg2 * m) / m
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论