.NET 6与.NET 8中DateTime.AddHours计算结果差异问题咨询
.NET 6与.NET 8代码结果差异原因分析
你的代码逻辑是计算start到end的总小时数,再将该小时数加回start得到newEnd,但在两个.NET版本中得到不同结果:
-.NET 6中newEnd的字符串表示为'8/12/2025 11:59:59'
-.NET 8中newEnd的字符串表示为'8/12/2025 11:59:58'
核心原因:浮点数精度限制
问题出在double hoursDiff = end.Subtract(start).TotalHours这一行:TotalHours返回的是double类型浮点数,而二进制浮点数无法精确表示所有十进制小数。
计算实际时间差:从2025-08-10 00:00:00到2025-08-12 23:59:59,总时长为2天23小时59分59秒,转换成小时是71.99972222222222...——这是一个无限循环的小数,用double存储时会产生精度损失,得到的是一个接近但不完全等于真实值的近似值。
.NET 6和.NET 8在处理这个近似浮点数的舍入逻辑、DateTime内部计算上存在细微调整,最终导致结果差了1秒。
修复方案
避免使用浮点数传递时间差,改用精确的TimeSpan类型直接存储时间跨度:
DateTime start = new DateTime(2025, 08, 10, 0, 0, 0); DateTime end = new DateTime(2025, 08, 12, 23, 59, 59); TimeSpan diff = end.Subtract(start); DateTime newEnd = start.Add(diff);
这种方式下newEnd会精确等于end,且在所有.NET版本中结果一致。
内容的提问来源于stack exchange,提问作者Aviv Dayan
相关产品推荐
相关产品推荐

