Java与Javascript计算结果的差异
我试图用Java实现一个JS函数。我几乎一字不差地复制了代码,因为它们都对浮点/双精度类型使用64位浮点,对数学运算符(and)使用相同的运算符优先级。但是,在调试时,我发现两者的结果有所不同。具体来说,JavaScript中的这一行:Java与Javascript计算结果的差异,java,javascript,math,floating-point,operator-precedence,Java,Javascript,Math,Floating Point,Operator Precedence,我试图用Java实现一个JS函数。我几乎一字不差地复制了代码,因为它们都对浮点/双精度类型使用64位浮点,对数学运算符(and)使用相同的运算符优先级。但是,在调试时,我发现两者的结果有所不同。具体来说,JavaScript中的这一行: var mu = M / (this.a * (1 - esq * (1 / 4 + esq * (3 / 64 + 5 * esq / 256)))); 及其Java等价物: Double mu = M / (a * (1 - esq * (1 / 4
var mu = M / (this.a * (1 - esq * (1 / 4 + esq * (3 / 64 + 5 * esq / 256))));
及其Java等价物:
Double mu = M / (a * (1 - esq * (1 / 4 + esq * (3 / 64 + 5 * esq / 256))));
具有以下值:
M=4373246.298519407, esq=0.006694379989312105, a=6378137.0
结果分别为0.6856620239020387和0.6868129133457879。有人能解释一下并给出正确的Java代码吗?这种不精确性正在转化为函数最终输出的巨大差异。Javascript和Java之间的代码并不完全相同 在Javascript中,所有数字都是双倍的,所以。然而,在Java中,整数除法将发生,因此例如
1/4
将产生0
,而不是0.25
如前所述,在Java中我得到0.6856620239020387
将Java数字更改为使用double
文字:
Double mu = M / (a * (1.0 - esq * (1.0 / 4.0 + esq * (3.0 / 64.0 + 5.0 * esq / 256.0))));
现在,我得到了另一个数字:
0.6868129133457879
,这是我在Javascript中得到的值。注意,没有必要更改所有常量。这也是可行的:Double mu=M/(a*(1-esq*(1.0/4+esq*(3.0/64+5*esq/256))代码>哎呀,我不应该错过整数除法。当我发布这个问题时,我并没有真正思考。谢谢你指出这一点!