考虑简单的代码
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;
}
}
现在,如果我运行它,程序会输出True。但如果我用346000000.0替换24 * 40 * 60 * 60 * 1000,则返回False。请注意,我在末尾添加.0,以便Java将其视为double而不是int。 int不能使用那么大的数字但是可以。
为什么?我怀疑这有关于数字在内部表示的方式。
答案 0 :(得分:3)
您正在使用24*40*60*60*1000
进行整数溢出。当你使用3456000000.0
时,没有溢出,因为正如你所说,它是双倍的。因此结果不同。
我们可以使用双打来避免溢出:
24.0 * 40.0 * 60.0 * 60.0 * 1000.0
或多头:
24L * 40L * 60L * 60L * 1000L
答案 1 :(得分:0)
int范围是-2,147,483,648到2,147,483,647 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html