java - Java和Javascript计算结果的差异

标签 java javascript math floating-point operator-precedence

我正在尝试用Java实现一个JS函数。我几乎逐字复制了代码,因为两者都使用 64 位浮点作为 float/Double 类型,并且对于数学运算符( http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.htmlhttps://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)))); 

及其 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 中,所有数字都是 double ,因此 floating-point math will take place 。但是,在 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 中得到的值。

关于java - Java和Javascript计算结果的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28115789/

相关文章:

java - 填充 ListView 时 LinearLayout 为 'pushed'

Java Swing : Drawing curved lines

javascript - 如何确定何时创建 jQuery 数据表并加载数据

objective-c - 我将如何在程序中执行此操作?数学题

java - 在哪里可以找到 jdb(java 调试器)实现?谁开发/维护它?

Java CGI 与 Servlet

javascript - 棱 Angular 分明的外部箭头

javascript - 如何在鼠标悬停时在完整日历中显示开始和结束时间?

ios - iOS Xcode 中的除法

math - 了解 lambda 演算有多大帮助?