【发布时间】: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 <> 0, 1 / ABC, 10 ^ 10)不会在Option Strict下编译。 -
两个结果都是正确的,Single 类型的变量只能存储 7 个准确的数字。其余的只是随机噪音。一个明显的取得成功的方法是简单地将 ABC 声明为 Double,这样可以得到额外的 8 个准确数字。