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

标签 java datetime precision date-arithmetic date-difference

关于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/

相关文章:

CUDA 浮点加法给出错误答案(与 CPU 浮点运算相比)

c# - 是否可以将 css 注入(inject)到使用 Html.FromHtml 的 TextView 中?

java - 如何查询月初到今天的 SQLite 数据

java - java 对象到 Date 或 DateTime 的转换

C# 如何检查当前为字符串的日期是否为今天?

javascript - 谷歌地图 v3 : Invalid value for constructor parameter 0 while drawing polylines

database - Sqlite 确保输入数据的长度正确

java - 如何在 UML 类图中表示回调

java - 如何在 iText 中创建 "reply"到便笺注释

javascript - 当我在开始日期和结束日期中选择相同的日期时,我的日期过滤器不显示结果。如何修复它?