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

时间:2009-10-20 20:51:00

标签: javascript actionscript-3 floating-point

嘿所有,让我们直接跳转到代码示例,以显示ECMAScript / JavaScript / AS3如何不能正确地进行数学运算(AS3对Number类使用'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 个答案:

答案 0 :(得分:9)

欢迎来到floating point calculation accuracy的精彩世界。一般来说,浮点计算会给你非常接近正确的结果,但是如果不使用舍入函数,比较绝对相等的输出不太可能给你预期的结果。

答案 1 :(得分:2)

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

Long explanation

答案 2 :(得分:2)

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

Have fun

答案 3 :(得分:2)

正如moonshadow所说,你遇到浮点精度问题。浮点数不适合以您期望的方式表示和对十进制值执行算术的任务。当人们尝试使用浮点数进行财务计算时,最常见到这类问题。维基百科的条目很好,但是您可能会从这个页面中获得更多信息,这会逐步完成容易出错的财务计算:http://c2.com/cgi/wiki?FloatingPointCurrency

要准确处理十进制数,您需要一个十进制库。我已经概述了两个用javascript编写的BigDecimal风格的库,可以满足你在另一个SO帖子中的需求,希望你会发现它们很有用:

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