VB6与VB.NET中的精度差异

VB6与VB.NET中的精度差异,vb.net,vb6,Vb.net,Vb6,我在VB6和VB.NET中为同一代码得到了两个不同的结果,该代码处理除法运算 ABC = 9.999728 result = IIf(ABC <> 0, 1 / ABC, 10 ^ 10) ABC=9.999728 结果=IIf(ABC 0,1/ABC,10^10) 在VB6中,我得到的结果是=0.1000027 在VB.NET中,结果为0.100002721 但是,当我在VB.NET中使用CSng(Val(CStr(result))时,我得到了0.1000027 1) 为什么V

我在VB6和VB.NET中为同一代码得到了两个不同的结果,该代码处理除法运算

ABC = 9.999728
result = IIf(ABC <> 0, 1 / ABC, 10 ^ 10)
ABC=9.999728
结果=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结果吗

在VB6中:

Dim ABC, result

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

随机使用
CSng()
当然会截断精度,应该像瘟疫一样避免过时的
Val()
函数。如果需要双精度,则使用
CDbl()

尝试
CDbl(Val(CStr(result))
是的,与VB6中的默认单精度相比,您在.NET中似乎获得了默认的双精度。如果
result
是单精度或双精度,则
result=IIf(ABC 0,1/ABC,10^10)
不会在
选项Strict
下编译。两个结果都是正确的,Single类型的变量只能存储7个精确数字。其余的只是随机噪音。一个明显的方法是简单地将ABC声明为Double,这会使您获得额外的8个精确数字。
0.100002720073986