有谁能解释一下以下结果:
?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更新: represent的答案提供了:差异与二进制分数不能总是表示十进制分数这一事实有关。但是,当两个表达式计算为相同的数据类型时,浮点偏移量为何不同?
?TypeName(DateAdd("s", 55, 0))
Date
?TypeName(#12:00:55 AM#)
Date
?VarType(DateAdd("s", 55, 0)) = VarType(#12:00:55 AM#)
True当我遇到这种浮点工件在……里面 过去时时,通常是因为结果实际上是两种不同的类型,至少在计算期间是这样的。这里的情况似乎并非如此。我还是很困惑。
更新2:罗斯更新的答案提供了对这个问题的更多洞察。我在追踪这件事上取得了进展。每个答案似乎都提出了新的问题。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 知道为什么会是这样吗?
发布于 2015-03-20 21:40:05
Date在VBA中表示为天数的整数加上表示时间的浮点数。由于时间是一个浮点(也许是双倍),它不能精确地表示每一秒。55秒是一天中的55/86400,或0.00063657407秒。这在浮点数中可能无法精确表示。
要了解更多信息,请尝试从文字值中减去Dateadd值,并将其转换为float。
编辑:下面是我所说的洞察力:
? cdbl(dateadd("s",55,0)) - cdbl(#12:00:55 AM#)
-1.0842021724855E-19 将时间文字用于日期结构的解析算法显然在执行与dateadd函数不同的操作,导致了小数点19位的错误。我的猜测是,其中一个或另一个使用的是单一的,它应该使用双。我想,您可以将此称为bug并向Microsoft报告。
编辑2:谷歌搜索出现了此链接,人们在那里谈论VBA的日期类型下的浮点现实。他们给出了一个不同的例子,错误在第17位而不是第19位:
? DateAdd("h",2,#8:00#) - #10:00#
-5.55111512312578E-17 还有这位先生编写了一些VBA代码来更准确地完成DateAdd的工作。(该页面上的站点在格式糟糕的代码块中显示代码,该代码块破坏了所有换行符,但代码是可下载的。)
https://stackoverflow.com/questions/29176173
复制相似问题