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

时间:2010-09-06 08:44:12

标签: javascript function sum

如果我有这个小功能:

<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

一轮将完成这项工作,但我只是不明白为什么代码在这个数字上做了... 在其他数字组合上,总和是正确的......

3 个答案:

答案 0 :(得分:19)

来自The Floating-Point-Guide:

  

为什么我的数字,如0.1 + 0.2加起来不是很好的一轮0.3,而且   相反,我得到一个奇怪的结果,如   0.30000000000000004吗

     

因为在内部,计算机使用a   格式(二进制浮点)   无法准确表示一个数字   像0.1,0.2或0.3一样。

     

编译代码时   解释,你的“0.1”已经存在   四舍五入到最接近的数字   格式,这导致一个小的   甚至在之前的舍入错误   计算发生了。

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

  

为什么其他计算如0.1 + 0.4正常工作?

     

在这种情况下,结果(0.5)可以   完全代表一个   浮点数,它是   可能导致舍入错误   输入数字相互抵消    - 但这不一定是可靠的(例如,当这两个数字是   存储在不同大小的浮动中   点表示首先是   舍入误差可能不会抵消每个   其他)。

     

在其他情况下,如0.1 + 0.3,   结果实际上并不是0.4,而是   足够接近,0.4是最短的   更接近结果的数字   而不是任何其他浮点数   数。然后显示许多语言   这个数字而不是转换   实际结果回到最近   小数部分。

答案 1 :(得分:4)

答案 2 :(得分:3)

只需遵循。

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