-1

在 Reflector 的摘录中,Microsoft.VisualBasic它引用Microsoft.VisualBasic.Conversion.Fix了 3 个地方,不包括Fix(Object)重载。

在每种情况下,它都适用Math.Round于结果。(特别是在DateAddand中DateDiff;第三次使用 inChoose确实减法,并在应用之前再次1冗余地转换为。)DoubleRound

Math.Round(Conversion.Fix(x)) <> Conversion.Fix(x)什么时候可以Double x

(我自己会检查参考源,但找不到包含Microsoft.VisualBasic. 的下载。) 参考源现在可以在线获得。

4

1 回答 1

1

然后将所有这些引用转换为Integeror Long

CInt并在从和进行转换时在其相应的 IL 转换之前CLng显式调用。Math.Roundconv.ovf.i4/8SingleDouble

这会强制执行作为 VB.NET 已知“怪癖”的银行家四舍五入。

conv.ovf.i4单独向零截断,这恰好与Fix(对于适合Integera 或 a Longfor的数字conv.ovf.i8)相同。

(当我最初输入问题时,我以为我已经检查过这不是原因。)

有一段时间,微软提供了参考源,所以我能够确认它们都包含在CIntor中CLng,并且Math.Round是由编译器添加的。

当前在上述链接中可用的 VB.NET“源”现在只提供没有代码的“参考程序集”:-(

于 2013-06-27T18:26:20.337 回答