关于float
上的Java数学运算的问题和int
数据类型。
我必须计算两个日期之间的日期差(以年为单位)。
代码:
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 modulo 232,即 1471228928。只有这样,它才会转换为 float
分为dateDiff
。在任何整数文字的末尾附加一个 L
可以解决这个问题,因为现在至少有一个乘法将使用 long
执行。但将 365
更改为 365.0
(或 365f
)可能会更清晰。 (实际上,@Chill 建议在所有常量上使用 f
对我来说似乎是最好的,尽管这并不是真正必要的。)
关于java - Java 中 float 的不同但相等的数学运算的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24127356/