0

我制作了一个存储简单值(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 中的这种简单减法不正确吗?或者也许我应该创建另一个存储这些“额外”参数的数组?

谢谢你的灯

4

3 回答 3

3

这是浮点数的固有问题。您可以使用 将数字四舍五入到给定的小数位数rot = rot.toFixed(2),或者您可以忽略微小的差异——它们需要很长时间才能显着相加。

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

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

于 2012-06-18T20:23:54.923 回答
0

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

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

也许另一个数组会是最好的...... :)

于 2012-06-18T20:20:57.643 回答
0

您正在减去Number对象,这些对象在 AS3 中是浮点数。浮点数本质上存在准确性问题。这里有一个解释为什么。

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

var arr:Array = [];
arr[0] = 2.9;
var rot:Number = Number(arr[0]) - Math.floor(arr[0]);
var rounded:Number = Number(rot.toFixed(1));
于 2012-06-18T20:23:07.427 回答