AS3:减法不精确

时间:2012-06-18 20:01:30

标签: arrays actionscript-3 subtraction

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

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

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

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

我应该 0.9 ,但我得到 0.89999

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

感谢你的灯光

3 个答案:

答案 0 :(得分:3)

这是floating point numbers的固有问题。你可以使用rot = rot.toFixed(2) round the number到给定的小数位数,或者你可以忽略这些微小的差异 - 它们需要花费很多才能显着增加。

另外,您可以使用rot = arr[0] % 1获取小数点后的部分。

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

答案 1 :(得分:0)

Actionscript使用浮点。许多小数部分并不完全可以表示。

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

也许另一个阵列最好......:)

答案 2 :(得分:0)

你正在减去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));