Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 计算中的微小误差_Javascript_Math - Fatal编程技术网

Javascript 计算中的微小误差

Javascript 计算中的微小误差,javascript,math,Javascript,Math,我正在尝试建立一个类似命运之轮的游戏,事实上它已经完成了,但似乎有一个奇怪的问题我无法解决 这是轮子本身,正如您所看到的,这些值是均匀分布的,每个值都有一个15°的切片 为了旋转轮子,我生成了一个随机数,它将是旋转的角度,我设置了轮子的动画,一切都很好,但是当旋转停止时,我必须从停止在顶部中心位置的轮子获得值,所以我认为这可以解决它: wheelValues = [ 1000, 3250, 1800, 1000, 1200, 3750, 5000, 1000, 3000, 1600,

我正在尝试建立一个类似命运之轮的游戏,事实上它已经完成了,但似乎有一个奇怪的问题我无法解决

这是轮子本身,正如您所看到的,这些值是均匀分布的,每个值都有一个15°的切片

为了旋转轮子,我生成了一个随机数,它将是旋转的角度,我设置了轮子的动画,一切都很好,但是当旋转停止时,我必须从停止在顶部中心位置的轮子获得值,所以我认为这可以解决它:

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。无论如何,这仍然不能解释为什么我有时得到的值与正确的值相差如此之远。比如说,什么?你在这个给你一个错误结果的问题上得到了什么?请举个例子。好吧,这绝对是个好主意,我来试试。