【问题标题】:difference in calculation results between Java and Javascript [duplicate]Java和Javascript之间计算结果的差异[重复]
【发布时间】:2015-01-23 17:51:43
【问题描述】:

我正在尝试用 Java 实现一个 JS 函数。我几乎逐字复制了代码,因为两者都对浮点/双精度类型使用 64 位浮点,而对数学运算符(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 代码吗?这种不准确性正在转化为函数最终输出的巨大差异

【问题讨论】:

    标签: java javascript math floating-point operator-precedence


    【解决方案1】:

    Javascript 和 Java 之间的代码并不完全等价。

    在 Javascript 中,所有数字都是双数,所以 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 中得到的值。

    【讨论】:

    • 请注意,不必更改所有常量。这也可以:Double mu = M / (a * (1 - esq * (1.0 / 4 + esq * (3.0 / 64 + 5 * esq / 256))));
    • 糟糕,我不应该错过整数除法。当我发布这个问题时,我并没有真正思考。感谢您指出!
    猜你喜欢
    • 2017-11-04
    • 2016-08-26
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多