2013-04-17 4 views
3

Рассмотрим простой кодJava простая математика аномалия

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 


public class Main { 


    public static void main(String args[]){ 
     System.out.println(isFresh("2013-03-26 06:25:34")); 
    } 

    private static boolean isFresh(String ts){ 

     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     Date date = new Date(); 
     try { 
      date = sdf.parse(ts); 

      if((new Date().getTime() - date.getTime())>(24*40*60*60*1000)){ //Ignore events before 40 days. 
       return true; 
      } 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 
} 

Теперь программа печатает Правда, если я запускаю его. Но если я заменю 24 * 40 * 60 * 60 * 1000 с 3456000000.0, он вернет False. Обратите внимание, что я добавляю .0 в конец, чтобы Java рассматривал его как double вместо int. int не может принять такое большое количество, но может удвоить.

Почему? Я подозреваю, что это способ сделать так, чтобы номера были представлены внутри страны.

+0

«INT не может считать, что большое число, но double can " – sashkello

+0

Вы можете использовать 3456E6 вместо –

+0

на боковой ноте, лучше использовать более высокий уровень api для такого типа ta sks: jodatime или, по крайней мере, встроенный Календарь –

ответ

3

Вы нажимаете целое переполнение с 24*40*60*60*1000. Когда вы используете 3456000000.0, переполнения нет, потому что, как вы говорите, это двойной. Отсюда и другой результат.

Мы можем избежать переполнения с помощью двойников:

24.0 * 40.0 * 60.0 * 60.0 * 1000.0 

или лонги:

24L * 40L * 60L * 60L * 1000L 
+0

Спасибо. Это устраняет основную ошибку в моем коде. –

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