【问题标题】:VB.Net anomalous conversion to stringVB.Net异常转换为字符串
【发布时间】: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


【解决方案1】:

我无法重现该问题,但您检查过您的区域设置吗?我怀疑隐式日期/数字/字符串转换问题,与错误解释的小数点(即“42026.786202581E+15”)有关。 你检查过你的区域设置吗? 如果 ToOADate() 已经是双倍,为什么还要强制它加倍?试试这个,告诉我你得到了什么:

    Dim a As Double = Now.ToOADate()
    Dim str As String = a.ToString()
    Debug.Print(a) ' Datetime to Double
    Debug.Print(str) ' Double to String
    Debug.Print(CDbl(str)) ' String to Double

我得到了这个答案(请注意我的系统设置为意大利语,所以我得到的是逗号而不是点):

42027,5610133565
42027,5610133565
42027,5610133565

您有不同的结果格式吗? 如果没有,您应该对“少数情况”进行更多调查,并报告您何时/何地拥有这样的 exp 值(并确保它恰好是具有 4 个整数位的“E+15”?)!

【讨论】:

    猜你喜欢
    • 2016-10-07
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多