2015-08-10 3 views
1
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 длинный расчет возвращает NaN?

+2

Почему люди голосуют за этот вопрос? Код сообщения отправителя, который воспроизводит проблему, и сообщает нам, в чем проблема. – Mark

ответ

8

Вы всегда делите на ноль. Вы вычитаете две длинные части, а затем выполняете целочисленное деление. Эти два тоскует будет меньше, чем 3600000, так что ваш результат будет (distanceInMeters/1000)/0 = NaN

+0

Так что в основном есть только недостающее приведение в поплавок. Спасибо за ответ. Решение состоит в том, чтобы написать 'float speed = (distanceInMeters/1000)/((float) (time-previousTime)/3600000);' – jfmg

+1

Вы также можете просто написать «3600000F» – Kon

+0

Yep. Мне не нравится, что мои вопросы получили 2 голоса. Каждый может забыть о делении Integer в Java -.- Особенно, когда вам приходилось писать JavaScript в течение некоторого времени. – jfmg

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

Решение добавить поплавка бросание так:

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

или вроде этого:

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

Я забыл о подразделении Integer в Java. Возможно, потому, что я написал много JavaScript-кода ранее.

Смежные вопросы