【发布时间】:2015-03-20 21:35:19
【问题描述】:
谁能解释以下结果:
?DateAdd("s", 54, 0) = #12:00:54 AM#
True
?DateAdd("s", 55, 0) = #12:00:55 AM#
False
?DateAdd("s", 56, 0) = #12:00:56 AM#
True
更新:Ross Presser 的回答提供了什么:差异与二进制分数不能总是代表十进制分数这一事实有关。但是为什么当两个表达式计算为相同的数据类型时浮点偏移量不同?
?TypeName(DateAdd("s", 55, 0))
Date
?TypeName(#12:00:55 AM#)
Date
?VarType(DateAdd("s", 55, 0)) = VarType(#12:00:55 AM#)
True
当我遇到这种浮点工件in 和past 时,通常是因为结果实际上是两种不同的类型,至少在评估期间的某个时候是这样。这似乎不是这里的情况。我还是一头雾水。
更新 2:Ross 的更新答案提供了对该问题的更多见解。我在追踪这个方面取得了进展。每个答案似乎都提出了新的问题。似乎 DateAdd 和日期文字都使用双精度,但由于某种原因,DateAdd 舍入到小数点后 18 位(或者可能在 19 处截断并且根本不舍入):
?CDbl(#12:00:55 AM#) - CDbl(55/86400)
0
?CDbl(DateAdd("s", 55, 0)) - CDbl(55/86400)
-1.0842021724855E-19
?0.000636574074074074 - 0.0006365740740740741
-1.0842021724855E-19
任何想法为什么会出现这种情况?
【问题讨论】:
-
一个肮脏的小技巧来解决这个问题是使用
? ("" & dateadd("s", 55, 0)) = #00:00:55#。
标签: vba