【问题标题】:Precision difference in VB6 and VB.NETVB6 和 VB.NET 的精度差异
【发布时间】:2015-06-05 15:37:41
【问题描述】:

对于处理除法运算的相同代码,我在 VB 6 和 VB.NET 中得到了两个不同的结果。

ABC = 9.999728
result = IIf(ABC <> 0, 1 / ABC, 10 ^ 10)

在 VB6 中,我得到了结果 = 0.1000027

在 VB.NET 中,结果为 0.100002721

但是,当我在 VB.NET 中使用 CSng(Val(CStr(result))) 时,我得到 0.1000027。

1) 为什么 VB.NET 产生的精度与 VB6 不同?

2) 为什么CSng(Val(CStr(result))) 产生与VB6 相同的精度?

3) 这可能看起来微不足道和简单,但这个问题会重复并传播到我的最终结果,这与 VB6 中的等效结果不同。我可以安全地假设 VB.NET 结果比 VB6 更精确并完全放弃 VB6 结果吗?

【问题讨论】:

  • 试试CDbl(Val(CStr(result)))
  • 是的,看起来您在 .NET 中获得了默认的双精度,而在 VB6 中获得了默认的单精度。
  • 如果result是Single或Double,那么result = IIf(ABC &lt;&gt; 0, 1 / ABC, 10 ^ 10)不会在Option Strict下编译。
  • 两个结果都是正确的,Single 类型的变量只能存储 7 个准确的数字。其余的只是随机噪音。一个明显的取得成功的方法是简单地将 ABC 声明为 Double,这样可以得到额外的 8 个准确数字。

标签: vb.net vb6


【解决方案1】:

在 VB6 中:

Dim ABC, result

ABC = 9.999728
result = IIf(ABC <> 0, 1 / ABC, 10 ^ 10)
MsgBox result

显示:

0.100002720073986

随机使用CSng()当然会截断精度,应该像瘟疫一样避免使用过时的Val()函数。如果你想要一个 Double 然后使用 CDbl() 代替。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 2012-06-24
    • 2015-08-31
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多