微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 为什么2个parseFloat变量的总和给我一个不正确的十进制数

参见英文答案 > Is floating point math broken?29个
如果我有这个小功能
<script type="text/javascript">

 function printFloat(){
      var myFloatNumber1 = document.getElementById('floatNumber1');
      var myFloatNumber2 = document.getElementById('floatNumber2');
      alert(parseFloat(myFloatNumber1.value) + parseFloat(myFloatNumber2.value))
 }

</script>

<input type="text" id="floatNumber1"></input>
<input type="text" id="floatNumber2"></input>

<input type="button" onclick="printFloat()"/>

在字段1中,输入:221.58
在字段2中输入:2497.74

我期望输入字段中的2个数字的和为2位数字:2719.32
但结果是一个不正确的数字…:2719.3199999999997

一轮将做这个工作,但是我不知道为什么代码在这个数字上做到这一点…
在其他数字组合中,总和是正确的…

解决方法

The Floating-Point-Guide:

Why don’t my numbers,like 0.1 + 0.2 add up to a nice round 0.3,and
instead I get a weird result like
0.30000000000000004?

Because internally,computers use a
format (binary floating-point) that
cannot accurately represent a number
like 0.1,0.2 or 0.3 at all.

When the code is compiled or
interpreted,your “0.1” is already
rounded to the nearest number in that
format,which results in a small
rounding error even before the
calculation happens.

在您的情况下,当您输入的值通过parseFloat()转换时,会发生舍入错误.

Why do other calculations like 0.1 + 0.4 work correctly?

In that case,the result (0.5) can be
represented exactly as a
floating-point number,and it’s
possible for rounding errors in the
input numbers to cancel each other out
– But that can’t necessarily be relied upon (e.g. when those two numbers were
stored in differently sized floating
point representations first,the
rounding errors might not offset each
other).

In other cases like 0.1 + 0.3,the result actually isn’t really 0.4,but close enough that 0.4 is the shortest number that is closer to the result than to any other floating-point number. Many languages then display that number instead of converting the actual result back to the closest decimal fraction.

原文地址:https://www.jb51.cc/js/153751.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐