不同的浏览器中使用相同的math结果

编辑:因为铬已经更新浏览器 – 这个问题是一些多余的,因为他们已经修复了一个内部的错误,这意味着这个问题不再发生。

我有一个锚定在canvas中心的圆圈animation。

圆越大,运动越不稳定。 但不仅如此,对于我来说,至less在Chrome浏览器到Firefox的情况下会更糟。

math是在这个函数中完成的:

function update(deltaTime){ var centerX = canvas.width/2; var centerY = canvas.height/2; i.currentAngle = (i.currentAngle || 0) + (deltaTime/1000 * i.rotationSpeed); if(i.currentAngle>2*Math.PI){ i.currentAngle-=2*Math.PI; } ix = centerX + (i.radius*i.factor) * Math.cos(i.currentAngle); iy = centerY + (i.radius*i.factor) * Math.sin(i.currentAngle); } 

这是工作示例中的代码:

http://jsfiddle.net/96QDK/

Chrome输出:

Firefox输出:

在这里输入图像说明

火狐似乎是最接近我的目标,但铬只是古怪。

为什么我会得到这样不同的结果? 我应该提一下,我问过几个人他们看到了什么,而且每个人都看到了不同的错误。

问题不在于Javascriptmath; 这是与canvas

http://jsfiddle.net/LDWBX/

 function bigCircle(angle) { var radius = 5000; //the bigger, the worse var x = canvas.width/2 + radius*Math.cos(angle); var y = canvas.height/2 + radius*Math.sin(angle); ctx.beginPath(); ctx.arc(x, y, radius, 0, 2 * Math.PI); ctx.lineWidth = 2; ctx.stroke(); } 

请注意,数字与Firefox中的数字完全相同 ,但Chrome中的红色弧线显然不正确。

截图

有趣的是,这适用于所有Math.PI / 4倍数的angular度,但在这些值之间的值是closures的(因此OP的例子中起伏的行为)。

我已经logging了铬错误#320335 。

编辑:它看起来像是在2012年5月第一次报告,是由Skia库中的错误引起的。

现在已经解决了。

不给你一个答案,但有趣的是在Chrome浏览器中有一个math问题

 i.currentAngle => 0.0; (deltaTime/1000 * i.rotationSpeed) = 0.025; i.currentAngle + (deltaTime/1000 * i.rotationSpeed) = 2215385637.025; 

如果您将单个部分从Update()变为Draw(),以便您可以使用

 var current = i.currentAngle; var delta = (deltaTime/1000 * i.rotationSpeed); ctx.fillText(("angle == " + current+ " delta " + delta),10,50); 

你得到(0.025和0)打印出来

如果你然后改变

 var current = i.currentAngle; var delta = (deltaTime/1000 * i.rotationSpeed); i.currentAngle = current + delta; ctx.fillText(("angle == " + i.currentAngle + " delta " + delta),10,50); 

你会得到一个疯狂的大的价值。

但如果你这样做

 var newval = current + delta; ctx.fillText(("angle == " + newval + " delta " + delta),10,50); 

那么newval的值约为0.025,这是你所期望的。

奇怪的是,如果你然后做到以下几点

 var newval = current + delta; i.currentAngle = newval ctx.fillText(("angle == " + newval + " delta " + delta),10,50); 

那么newval现在是完全疯狂的价值….