Java中不同但相等的浮点运算的不同结果

Java中不同但相等的浮点运算的不同结果,java,datetime,precision,date-arithmetic,date-difference,Java,Datetime,Precision,Date Arithmetic,Date Difference,关于float和int数据类型上的Java数学操作的问题 我必须计算两个日期之间的日期差(以年为单位) 守则: SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Object date = obj.getInfoItem().getInfoValue(); Date today = new Date(); Date birthDate = null; float dateDiff; int age0, age1; tr

关于
float
int
数据类型上的Java数学操作的问题

我必须计算两个日期之间的日期差(以年为单位)

守则:

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
是正确的结果

既然
age0
age1
上的运算在数学上是相等的,为什么结果不同?
为什么操作«
(float/(a\*b\*c))/d
»和«
(float/(a\*b\*c\*d))
»之间有区别,其中
a
b
c
d
int
来扩展Sotirios的注释:整数文本
365
24
.60
,和
1000
都有类型
int
。因此,将使用
int
类型执行乘法。由于数学结果为31536000000,最大可能的
int
为2147483648,因此结果溢出,结果将结束。因此,结果将是
int
,其值等于31536000000模232,即1471228928。只有这样,它才会被转换成一个
float
,并被划分为
dateDiff
。将
L
附加到任何整数文本的末尾将修复它,因为现在至少有一个乘法将使用
long
执行。但将
365
更改为
365.0
(或
365f
)可能更清晰。(事实上,@Chill建议对所有常量使用
f
,这对我来说似乎是最好的,尽管这并不是真的必要。)

这个365*24*60*60*1000是整数溢出。为了进一步扩展,如果你想使用常量值在浮点中进行计算,你应该将常量显式设置为浮点。例如,
365f*24f*60f*60f*1000f
«365f*24f*60f*60f*1000f»修复了该问题。谢谢