0

关于 Java 数学运算floatint数据类型的问题。

我必须计算两个日期之间的年差。

编码:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Object date = obj.getInfoItem().getInfoValue();

Date today = new Date();
Date birthDate = null;
float dateDiff;
int age0, age1;

try {
        // unify the date format
        birthDate = format.parse(date.toString());
        today = format.parse(format.format(today));
} catch (ParseException e) {
        e.printStackTrace();
}

// calculate the age in years with round    
dateDiff = today.getTime() - birthDate.getTime();
age0     = (int)((dateDiff / (24 * 60 * 60 * 1000)) / 365);
age1     = (int)(dateDiff / (365 * 24 * 60 * 60 * 1000));

由于Java中的日期差是以毫秒为单位计算的,因此我们必须在计算后做一些内务工作,并将接收到的结果从毫秒转换为年。

代码执行后,我在调试器中得到以下结果:

dateDiff = 8.4896639E11  
age0 = 26  
age1 = 577

age0是正确的结果。

既然两个运算在数学age0age1是相等的,为什么结果不同呢?(float / (a\*b\*c)) / d为什么操作 « » 和 « »之间存在差异(float / (a\*b\*c\*d)),其中a, b, c,dint

4

1 回答 1

2

扩展 Sotirios 的评论:整数文字365, 24, 60, and 1000all have type int。因此,将使用int类型执行乘法。由于数学结果是 31536000000,最大可能int是 2147483648,结果溢出,结果会回绕。因此,结果将是int其值等于 31536000000 模 2 32,即 1471228928。只有这样,它才会转换为 afloat以被划分为dateDiff。将 an 附加L到任何整数文字的末尾将修复它,因为现在至少有一个乘法将使用long. 但是更改365365.0(或365f)。(实际上,@Chillf对所有常量使用的建议对我来说似乎是最好的,尽管这并不是真正必要的。)

于 2014-06-09T19:26:28.650 回答