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或至少内置日历