【发布时间】:2015-03-22 06:19:57
【问题描述】:
我们有一个 VB.Net 应用程序使用以下表达式:
CStr(CDbl(Now.ToOADate()))
(代码是从 VB6 移植而来的。)我在几个小时前对其进行了测试,它完全按照应有的方式评估/呈现为“42026.786202581”。但是在少数情况下(我可以从数据中看出)它呈现为“42026.786202581E+15”。
这当然是一个非常错误的结果,整数部分是自 1900 年 1 月 1 日以来的天数,而 42K 是一个有理值,它不需要乘任何东西(忘记 10^15th!)
你可能已经注意到它使用的是 VB6 兼容性,旧的类型强制函数,我将其更改为:
Convert.ToDouble(Now.ToOADate()).ToString()
但无论如何我无法在实验室中重现它,所以输出不变,正如预期的那样...... OADate 的二进制格式实际上与双浮点数相同,就转换而言应该是显而易见的......
归根结底,我什至无法想象这么简单的表达式怎么会相差 15 个数量级!任何见解都值得赞赏。
TIA
【问题讨论】:
-
调用 CDbl 是多余的。
ToOADate方法已经返回一个 double。你为什么要把它转换成字符串? -
如果您将 OADate 转换为字符串,它会呈现日期和时间字符串,您必须转换/强制转换为 double 才能呈现浮点格式的字符串。
-
字符串被用作唯一性——我知道,我知道,改用 GUID。我只是想了解所表现出来的问题是如何可能的。
-
OADate 具有与双精度相同的二进制格式,但存在与类型相关的运算符和其他类代码,需要转换/强制转换。
-
您是在暗示
CDbl以某种方式更改了ToOADate返回的 Double?当我测试时,我得到了相同的值。DateTime.Now.ToOADate()返回的值完全与CDbl(DateTime.Now.ToOADate())相同。在这种情况下调用CDbl显然是多余的。我不确定您认为对CDbl的额外调用会发生什么变化。
标签: vb.net floating-point double scientific-notation