在Microsoft.VisualBasic
的反射器摘录中,它在3个地方引用Microsoft.VisualBasic.Conversion.Fix
,不包括Fix(Object)
重载。
在每种情况下,它都会将Math.Round
应用于结果。 (特别是在DateAdd
和DateDiff
; Choose
中的第三次使用会减去1
,并在应用Double
之前再次强制转换为Round
。 )
何时Math.Round(Conversion.Fix(x)) <> Conversion.Fix(x)
可以Double x
?
(我自己检查参考源,但我can't find a download that does include 参考源现在可用online。 Microsoft.VisualBasic
。)
答案 0 :(得分:1)
然后将所有这些引用转换为Integer
或Long
:
CInt
和CLng
投射时, Math.Round
和conv.ovf.i4/8
在对应的IL Single
投射之前明确调用Double
。
这会强制使用Banker's Rounding这个VB.NET已知的“怪癖”。
conv.ovf.i4
单独截断为零,恰好与Fix
相同(适用于Integer
的数字,或Long
conv.ovf.i8
}})。
(当我最初输入问题时,我认为我已经检查过这不是原因。)
有一段时间,微软提供了Reference Source,因此我能够确认它们全部包含在CInt
或CLng
中,并且Math.Round
被添加了{{1}}编译器。
目前在上述链接中提供的VB.NET“源”现在只提供没有代码的“引用程序集”: - (