奇怪的Javascript行为:浮点加法给出了错误的答案

时间:2009-06-24 06:16:30

标签: javascript floating-point

  

可能重复:
  Is JavaScript’s math broken?

这看起来真的很愚蠢,但在运行时会显示

7.300000000000001而不是7.3

<script language="javascript">
    function buttonClicked() {
        var mySum = 1.1 + 1.1 + 1.1 + 0 + 4;
        alert(mySum);
    }
</script>

这会导致什么?我在一个非常基本的aspx页面上有javascript。我们实际上是使用javascript从表单输入中添加值,这只是一个打破它的数字的例子,还有很多其他的..

知道可以做什么吗?!?

3 个答案:

答案 0 :(得分:8)

它与十进制值如何转换为二进制浮点数有关。 1/10变成二进制的重复小数,因此数字没有完美表示,重复操作可以暴露错误。

JavaScript使用IEEE-754浮点数作为记录。其他一些语言有同样的问题。

如何处理?在您的情况下,也许toPrecision()

答案 1 :(得分:4)

浮点数的尾数部分(小数点后的部分)存储为分数之和。它们是通过添加一系列分数来计算的。分数的顺序是:

1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, ... etc

二进制表示存储为0和1,表示是/否。例如,001010将为0 * 1/2 + 0 * 1/4 + 1 * 1/8 + 0 * 1/16 + 1 * 1/32。

这是浮点数不准确的原因的一个粗略示例。当您添加精度(float - &gt; double - &gt; long double)时,您可以获得更高的精度。

存储的基础二进制数据分为两部分 - 一部分用于小数点前面的部分,另一部分用于小数点后的部分。由于可以执行计算的速度(以及可能还有其他因素在上面),它已被采用IEEE standard

检查此链接以获取更多信息: http://docs.sun.com/source/806-3568/ncg_goldberg.html

答案 2 :(得分:1)

http://docs.sun.com/source/806-3568/ncg_goldberg.html

每个人都应该了解浮点数。