Javascript 计算中的微小误差
我正在尝试建立一个类似命运之轮的游戏,事实上它已经完成了,但似乎有一个奇怪的问题我无法解决 这是轮子本身,正如您所看到的,这些值是均匀分布的,每个值都有一个15°的切片 为了旋转轮子,我生成了一个随机数,它将是旋转的角度,我设置了轮子的动画,一切都很好,但是当旋转停止时,我必须从停止在顶部中心位置的轮子获得值,所以我认为这可以解决它:Javascript 计算中的微小误差,javascript,math,Javascript,Math,我正在尝试建立一个类似命运之轮的游戏,事实上它已经完成了,但似乎有一个奇怪的问题我无法解决 这是轮子本身,正如您所看到的,这些值是均匀分布的,每个值都有一个15°的切片 为了旋转轮子,我生成了一个随机数,它将是旋转的角度,我设置了轮子的动画,一切都很好,但是当旋转停止时,我必须从停止在顶部中心位置的轮子获得值,所以我认为这可以解决它: wheelValues = [ 1000, 3250, 1800, 1000, 1200, 3750, 5000, 1000, 3000, 1600,
wheelValues = [
1000, 3250, 1800, 1000, 1200, 3750, 5000, 1000, 3000, 1600, 1000, 3500,
1000, 2000, 1000, 2750, 1000, 4000, -1, 1000, 2500, 1400, 1000, 2250
];
if (toAngle > 360)
{
toAngle = toAngle - (Math.floor(toAngle / 360) * 360);
}
arrIndex = Math.floor(toAngle / 15) + 1;
result = wheelValues[arrIndex];
其中,toAngle
是我生成的随机自旋,可以在370到1440之间
这种方法在10次中有8/9次有效,我实际上可以得到轮子停止时的正确值,但我真的不明白为什么有时该值关闭(有时真的关闭,甚至不接近正确值)。出于某种原因,您将1添加到数组索引中
数组索引从0开始 我可以看到两个问题 首先,这一行:
if (toAngle > 360)
如果toAngle==360,我相信这会产生错误,因为您将跳过“模数”部分,toAngle最终将为24(大于您的数据集)
第二:
arrIndex = Math.floor(toAngle / 15) + 1;
不需要+1这个值,因为你永远不会得到你的第一个值,有时你会超过数组的界限
另外,关于为什么会得到奇数值,您是否尝试过编写一些简单的代码来调试您的假设?编写一个循环,循环从370到1440(您指定的输入边界),并查看您对每个值的计算结果。将其打印到文件或屏幕上,您可以快速扫描以查看问题所在。顺便说一句,如果您首先将随机数设置为15度的偶数倍,那么您就不需要所有的舍入和地板,例如
function randDeg() {
var epoch = 360; // minimum value
var max = 1440; // maximum value to return
var step = 15; // even multiple to return
var t = Math.random() * (max - epoch) | 0;
t -= t % 15;
return t + epoch;
}
将返回一个数字n,如果没有某种复制演示,我们也无法返回,我想。这是一个移动应用程序,我不知道如何向您展示它的工作原理。可以使用模运算符简化角度。toAngle%360我想你想要360的偶数倍,所以
toAngle-=toAngle%360
,但如果你这样做,每次都会以相同的值结束。是的,我知道。在较旧的版本中,我有Math.floor((toAngle-7.5)/15)+1
,需要+1。无论如何,这仍然不能解释为什么我有时得到的值与正确的值相差如此之远。比如说,什么?你在这个给你一个错误结果的问题上得到了什么?请举个例子。好吧,这绝对是个好主意,我来试试。