gpt4 book ai didi

java - Java 中 float 的不同但相等的数学运算的不同结果

转载 作者:行者123 更新时间:2023-12-02 05:45:22 25 4
gpt4 key购买 nike

关于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 , dint .

最佳答案

扩展 Sotirios 的评论:整数文字 36524601000 全部类型为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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com