为什么回合(修复(x))?

时间:2013-06-27 18:26:20

标签: .net vb.net rounding

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

在每种情况下,它都会将Math.Round应用于结果。 (特别是在DateAddDateDiff; Choose中的第三次使用会减去1,并在应用Double之前再次强制转换为Round。 )

何时Math.Round(Conversion.Fix(x)) <> Conversion.Fix(x)可以Double x

(我自己检查参考源,但我can't find a download that does include Microsoft.VisualBasic。) 参考源现在可用online

1 个答案:

答案 0 :(得分:1)

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

CIntCLng投射时,

Math.Roundconv.ovf.i4/8在对应的IL Single投射之前明确调用Double

这会强制使用Banker's Rounding这个VB.NET已知的“怪癖”。

conv.ovf.i4单独截断为零,恰好与Fix相同(适用于Integer的数字,或Long conv.ovf.i8 }})。

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

有一段时间,微软提供了Reference Source,因此我能够确认它们全部包含在CIntCLng中,并且Math.Round被添加了{{1}}编译器。

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