Java简单的数学异常

时间:2013-04-17 01:18:21

标签: 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;
    }
}

现在,如果我运行它,程序会输出True。但如果我用346000000.0替换24 * 40 * 60 * 60 * 1000,则返回False。请注意,我在末尾添加.0,以便Java将其视为double而不是int。 int不能使用那么大的数字但是可以。

为什么?我怀疑这有关于数字在内部表示的方式。

2 个答案:

答案 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)