Java简单数学异常
考虑一下简单的代码Java简单数学异常,java,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 st
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。但如果我将24*40*60*60*1000替换为3456000000.0,则返回False。请注意,我在末尾添加了一个.0,以便Java将其视为double而不是int。int不能接受这么大的数字,但double可以
为什么呢?我怀疑这与数字在内部的表示方式有关 您使用
24*40*60*60*1000遇到整数溢出。当您使用3456000000.0
时,不会出现溢出,因为正如您所说,它是一个双精度的。因此,结果不同
我们可以使用双精度来避免溢出:
24.0 * 40.0 * 60.0 * 60.0 * 1000.0
或长:
24L * 40L * 60L * 60L * 1000L
整数范围为-2147483648到2147483647
“int不能接受这么大的数字,但double可以”您可以使用3456E6,而不是另一个注意事项,最好使用更高级别的api来完成这类任务:jodatime或至少内置日历