【问题标题】:AS3: subtraction not exactAS3:减法不准确
【发布时间】:2012-06-18 20:01:29
【问题描述】:

我制作了一个数组来存储简单的值 (1,1,2,1...),这些值表示小型 2D 游戏的图块。

我想在这个数组中存储一个旋转(和额外的)参数,所以我在我的值中添加了小数: 1.45、1.90、2.0、1.90... 例如,1.45 表示我想要一个草瓦 (1),旋转 45°。

要“解析”我的小数,我会这样做:

arr[0] = 2.9;
rot = arr[0] - Math.floor(arr[0]);

我应该得到 0.9,但我得到的是 0.89999。

知道为什么 AS3 中的这种简单减法不正确吗?或者也许我应该创建另一个存储这些“额外”参数的数组?

谢谢你的灯

【问题讨论】:

    标签: arrays actionscript-3 subtraction


    【解决方案1】:

    这是floating point numbers的固有问题。您可以使用rot = rot.toFixed(2) 将round the number 精确到给定的小数位数,或者您可以忽略微小的差异——它们需要很长时间才能显着增加。

    顺便说一句,您可以使用rot = arr[0] % 1 获取小数点后的部分。

    使用小数存储旋转值似乎不是最佳选择,尤其是因为您的方式只允许旋转最多 100 度。另外,如果您想存储比图块类型和旋转更多的值怎么办?最好使用多个数组(甚至是自定义类的对象数组)。

    【讨论】:

    • 您还可以创建一个自定义类“Tile”,它具有“Rotation”属性,以及草地、石头、路面、地毯等的子类。
    • 我可以建议除了链接到文档之外,您实际上还添加了toFixed 的示例吗?如果文档要倒下或移动,那么这个答案将不再是答案。
    • 类可能是个好主意,@CarlF,但我不太确定是否每个图块类型的子类都是正确的方法。这可能是很多不必要的开销,具体取决于游戏的运行方式。
    • @CheeseWarlock,您也可以创建一个具有“纹理”属性的“平铺”类,其中纹理可以是草、地毯等。现在我正在尝试弄清楚平铺系统如何当每个瓷砖都可以单独旋转时工作。听起来像一个非常困难的镶嵌问题......
    【解决方案2】:

    Actionscript 使用浮点数。许多小数部分无法精确表示。

    您可以使用另一个数组来处理额外的参数,或者将您的值乘以某个静态值...例如 1,000 ?这会将额外的参数移动到整个单元。 1000 可让您放置任何 0-359° 值。虽然您必须进行额外的解析来评估减法或加法的进位。

    也许另一个数组会更好... :)

    【讨论】:

      【解决方案3】:

      您正在减去 Number 对象,这些对象在 AS3 中是浮点数。浮点数本质上存在准确性问题。 Here 解释了原因。

      您最简单的解决方案是四舍五入:

      var arr:Array = [];
      arr[0] = 2.9;
      var rot:Number = Number(arr[0]) - Math.floor(arr[0]);
      var rounded:Number = Number(rot.toFixed(1));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-22
        • 2020-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多