3

考虑简单的代码

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。但是如果我用 3456000000.0 替换 24*40*60*60*1000,它会返回 False。请注意,我在末尾附加了一个 .0,以便 Java 将其视为 double 而不是 int。int 不能取那么大的数字,但 double 可以。

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

4

2 回答 2

3

您正在使用24*40*60*60*1000. 当您使用3456000000.0时,没有溢出,因为正如您所说,它是双倍的。因此结果不同。

我们可以使用双打来避免溢出:

24.0 * 40.0 * 60.0 * 60.0 * 1000.0

或多头:

24L * 40L * 60L * 60L * 1000L
于 2013-04-17T01:20:29.710 回答
0

int 范围是 -2,147,483,648 到 2,147,483,647 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

于 2013-04-17T01:25:00.043 回答