为什么这个Java长计算会返回NaN?

时间:2015-08-10 18:28:38

标签: java long-integer nan

import java.util.*;
import java.lang.*;
import java.io.*;

public class MyClass {
    public static void main (final String[] args) {
        float distanceInMeters = 0.0f;
        long time = 1439230171182L;
        long previousTime = 1439230111554L;
        float speed = (distanceInMeters / 1000) / ((time - previousTime)/3600000);
        System.out.println(speed);
    }
}

此计算返回“NaN”。有谁知道为什么?

3 个答案:

答案 0 :(得分:8)

你总是被零除。你减去两个长子然后进行整数除法。这两个长度将少于3600000,因此您的结果将为(distanceInMeters / 1000) / 0 = NaN

答案 1 :(得分:5)

让我们放一些我们的值并计算它:




 (distanceInMeters / 1000)/((time  -  previousTime)/ 3600000);
  







 (0.0f / 1000)/((1439230171182L)相同 -  1439230111554L)/ 3600000)
  




0.0f / 1000 = 0.0f 1439230171182L - 1439230111554L = 59628L 所以我们得到




 (0.0f)/((59628L)/ 3600000)
  




59628L / 3600000 = 0 (整数除法)





所以我们以 0.0f / 0 NaN (非数字)。

如果你要除 1.0f / 0 你会得到 Infinity ,对于 -1.0f / 0 你会得到 -Infinity




答案 2 :(得分:2)

解决方案是添加如下的浮动转换:

float speed = (distanceInMeters / 1000) / ((float)(time - previousTime)/3600000);

或者像这样:

float speed = (distanceInMeters / 1000) / ((time - previousTime)/3600000.0f);

我忘记了Java中的Integer部门。可能是因为我以前写了很多JavaScript代码。