【问题标题】:Why does this Java long calculation return NaN? [duplicate]为什么这个 Java 长计算返回 NaN? [复制]
【发布时间】:2015-11-02 18:48:54
【问题描述】:
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”。有谁知道为什么?

【问题讨论】:

  • 为什么人们不赞成这个问题?提问者发布重现问题的代码并告诉我们问题所在。

标签: java long-integer nan


【解决方案1】:

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

【讨论】:

  • 所以基本上只缺少一个要浮动的演员表。感谢您的回答。解决办法是写float speed = (distanceInMeters / 1000) / ((float)(time - previousTime)/3600000);
  • 你也可以直接写3600000F
  • @teddy3D 我投了反对票,因为这非常简单,您可以自己调试。
  • 我猜调试器现在已经过时了。
  • 这个问题非常适合 StackOverflow。因为发帖人没有开发出自己找到答案的技术,这不是投反对票的理由。他付出了努力,发布了代码,解释了问题并寻求帮助。
【解决方案2】:

让我们输入一些值并计算它:

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

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

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

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

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

所以我们使用0.0f / 0 ,即NaN(不是数字)。
如果您将1.0f / 0 分开,您将得到Infinity,对于-1.0f / 0,您将得到-Infinity

【讨论】:

    【解决方案3】:

    解决方案是像这样添加一个浮动演员:

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

    或者像这样:

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

    我忘记了 Java 中的整数除法。可能是因为我之前写了很多 JavaScript 代码。

    【讨论】:

      猜你喜欢
      • 2020-11-18
      • 2020-04-27
      • 2020-03-25
      • 2018-10-24
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 2011-10-23
      相关资源
      最近更新 更多