是否不可能在 actionScript 3 中通过十进制数在 for 循环中递增并获得准确的结果?

Is it impossible to increment in a for loop by decimal numbers in actionScript 3 and get accurate results?

我似乎无法在网上任何地方找到这个问题的答案,但是这个 for 循环虽然看似有效,但会创建一个无限循环,因为 actionscript 似乎无法识别 0.1、0.2、0.3 等。这个 for 循环只会无限地跟踪 0、0、0 等等。

谁能告诉我为什么 actionscript 这样做,有没有办法在 actionscript 中获得精确的小数增量?

for(var i:int = 0; i<1; i = i + 0.1)
{
    trace(i);
}

正如 Hobo Sapiens 的评论中所报告的那样,最初的问题是您已将 i 声明为 int,但希望它存储分数。但是,即使您已修复该问题,您也可能会遇到舍入错误问题。将浮点近似值加到 0.1 并不是获得最接近 0.9 或 1.0 的精确值的好方法。

一般有两种解决方法:

  1. 使用十进制数据类型。我没能找到 Actionscript 的十进制算法包,但这并不意味着没有。
  2. 使用一个代表您想要的值的缩放版本的整数。在循环的情况下,您将在每次迭代中将 i 递增 1,并将其限制为小于 10。然后,您将在循环内使用 i 除以 10 的数字转换。这导致在循环内使用最接近 0、0.1、0.2 等的浮点数。

还不能评论,所以我会post它作为答案:

在某些情况下,按浮点值递增很有用。如果它绝对是错误的,为什么它会成为可能呢?

akmozo 的建议是一个很好的方法,您可以 i = Number((i+0.1).toFixed(decimalSpacesYouWant)) 而不是递增 i = i + 0.1。这将 return 一个没有通常舍入问题的数字。它对于非常小的值(收敛于零)特别有用,这些值在某些时候往往会翻转为 InfinityNaN