-1

Reflector の抜粋では、オーバーロードを除いて 3 か所Microsoft.VisualBasicで参照されています。Microsoft.VisualBasic.Conversion.FixFix(Object)

いずれの場合もMath.Round結果に適用されます。(特にDateAddand でDateDiff; での 3 番目の使用Chooseは を減算し1、 を適用する前に冗長にDouble再度キャストしRoundます。)

いつできMath.Round(Conversion.Fix(x)) <> Conversion.Fix(x)ますDouble xか?

(リファレンス ソースを自分で確認したいのですが、を含むダウンロードが見つかりませんMicrosoft.VisualBasic ) リファレンス ソースがオンラインで入手できるようになりました。

4

1 に答える 1

1

これらの参照はすべてIntegerorにキャストされLongます。

CIntandからキャストする場合、対応する ILキャストの前に明示的にCLng呼び出します。Math.Roundconv.ovf.i4/8SingleDouble

これにより、VB.NET で知られている「癖」であるバンカーの丸めが強制されます。

conv.ovf.i4だけでゼロに向かって切り捨てられます。これはたまたま( 、またはforFixに収まる数値の場合) と同じです。IntegerLongconv.ovf.i8

(最初に質問を入力したとき、これが原因ではないことを確認したと思いました。)

しばらくの間、Microsoft はReference Sourceを公開していたので、それらがすべてCIntorCLngで囲まMath.Roundれ、コンパイラによって が追加されていることを確認できました。

上記のリンクで現在利用可能な VB.NET の「ソース」は、コードのない「参照アセンブリ」のみを提供するようになりました :-(

于 2013-06-27T18:26:20.337 に答える