代码之家  ›  专栏  ›  技术社区  ›  rinogo

为什么我在ECMAScript/ActionScript 3中看到不精确的浮点结果?

  •  1
  • rinogo  · 技术社区  · 15 年前

    大家好,让我们直接跳到一个代码示例,展示ECMAScript/JavaScript/AS3如何不能正确地进行简单的数学运算(AS3对数字类使用了“IEEE-754双精度浮点数字”,该数字类应该与JavaScript中使用的数字相同)。。。

    trace(1.1);         //'1.1': Ok, fine, looks good.
    trace(1.1*100);     //'110.00000000000001': What!?
    trace((1.1*100)/100);  //'1.1': Brings it back to 1.1 (since we're apparently multiplying by *approximately* 100 and then dividing by the same *approximate* '100' amount)
    trace(1.1*100-110); //'1.4210854715202004e-14': Proof that according to AS3, 1.1*100!=110 (i.e. this isn't just a bug in Number.toString())
    trace(1.1*100==110);   //'false': Even further proof that according to AS3, 1.1*100!=110
    

    有什么好处?

    4 回复  |  直到 14 年前
        1
  •  9
  •   moonshadow    15 年前

    floating point calculation accuracy . 一般来说,浮点计算将得到非常接近正确的结果,但如果不使用舍入函数,比较绝对相等的输出不太可能得到预期的结果。

        2
  •  2
  •   Paddy    15 年前

    这只是使用浮点数的一个副作用-这些是十进制数的二进制表示,总会有一些近似值。

    Long explanation

        3
  •  2
  •   Matt Dawdy    15 年前

    浮点不一致是许多语言中的一个已知问题。这是因为计算机不是为处理浮点数而设计的。

    Have fun

        4
  •  2
  •   Community CDub    7 年前

    http://c2.com/cgi/wiki?FloatingPointCurrency

    要准确地处理十进制数,您需要一个十进制库。我在另一篇SO文章中概述了两个用javascript编写的BigDecimal样式库,它们可能适合您的需要,希望您会发现它们很有用:

    https://stackoverflow.com/questions/744099/javascript-bigdecimal-library/1575569