我制作了一个数组库存简单值(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中这种简单的减法不正确吗?或者我应该创建另一个存储这些“额外”参数的阵列?
感谢你的灯光
答案 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));