Bug*_*ler 2 javascript java math floating-point operator-precedence
我正在尝试用Java实现JS函数.我几乎逐字地复制了代码,因为它们都使用浮点/双精度类型的64位浮点数和数学运算符的相同运算符优先级(http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html和https://msdn.microsoft.com/en-us/library/ie/z3ks45k7(v=vs.94).aspx).但是,我看到两者在调试时的结果有所不同.具体来说,JavaScript中的这一行:
var mu = M / (this.a * (1 - esq * (1 / 4 + esq * (3 / 64 + 5 * esq / 256))));
Run Code Online (Sandbox Code Playgroud)
和它的Java等价物:
Double mu = M / (a * (1 - esq * (1 / 4 + esq * (3 / 64 + 5 * esq / 256))));
Run Code Online (Sandbox Code Playgroud)
具有以下值:
M=4373246.298519407, esq=0.006694379989312105, a=6378137.0
Run Code Online (Sandbox Code Playgroud)
结果分别为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))));
Run Code Online (Sandbox Code Playgroud)
现在,我得到另一个数字:0.6868129133457879,我在Javascript中得到的值.