17

VB.NetのMath.Round関数で奇妙なケースに遭遇しました

Math.Round((32.625), 2)

結果:32.62

Math.Round((32.635), 2)

結果:32.64

32.63が必要ですが、これらの場合、関数は異なるロジックで機能しています。

小数部分を取得して、それに対して何かをしたいことを行うことができます。しかし、これはあまりにも奇妙ではありません。1つはより高い値に丸められ、もう1つはより低い値に丸められます。

では、小数部をいじることなく、 32.625から32.63を取得するにはどうすればよいですか?(数学の自然な論理として)

4

5 に答える 5

39

Math.Roundデフォルトでは銀行の丸めを使用します。別のオプションを指定することで、これを変更できMidPointRoundingます。MSDNから:

ゼロからの四捨五入

中点の値は、ゼロから離れた次の数値に丸められます。たとえば、3.75ラウンドで3.8、3.85ラウンドで3.9、-3.75ラウンドで-3.8、-3.85ラウンドで-3.9です。この形式の丸めは、MidpointRounding.AwayFromZero列挙型メンバーによって表されます。ゼロからの丸めは、最も広く知られている丸めの形式です。

最も近い値への丸め、または銀行の丸め

中点の値は、最も近い偶数に丸められます。たとえば、3.75と3.85の両方が3.8に丸められ、-3.75と-3.85の両方が-3.8に丸められます。この形式の丸めは、MidpointRounding.ToEven列挙型メンバーによって表されます。

最も近い値への丸めは、財務および統計操作で使用される丸めの標準形式です。IEEE標準754のセクション4に準拠しています。複数の丸め演算で使用すると、中点の値を一方向に一貫して丸めることによって発生する丸め誤差が減少します。場合によっては、この丸め誤差が重大になることがあります。

だから、あなたが欲しいのは:

Math.Round(32.625, 2, MidpointRounding.AwayFromZero)
Math.Round(32.635, 2, MidpointRounding.AwayFromZero)

他の人が述べているように、精度が重要な場合Decimalは、浮動小数点型ではなく変数を使用する必要があります。例えば:

Math.Round(32.625D, 2, MidpointRounding.AwayFromZero)
Math.Round(32.635D, 2, MidpointRounding.AwayFromZero)
于 2013-02-12T14:48:48.553 に答える
4

これを(メモリから)試してください:

Math.Round((32.635), 2, MidPointRounding.AwayFromZero)

于 2013-02-12T14:49:36.930 に答える
2

これを試して。

Dim d As Decimal = 3.625
    Dim r As Decimal = Math.Ceiling(d * 100D) / 100D
    MsgBox(r)

これはあなたが望むことをするはずです。

于 2013-02-12T14:44:54.777 に答える
2

彼女はあなたがあなたの人生を単純化してそれを作るためにあなたが追加することができる速い機能を持っているのであなたはいつもそれほど多くをタイプする必要はありません。

 Private Function roundd(dec As Decimal)
    Dim d As Decimal = dec
    Dim r As Decimal = Math.Ceiling(d * 100D) / 100D
    Return r
End Function

これをアプリケーションに追加してから、関数を使用します

roundd(3.624)

またはあなたが必要なものは何でも。

結果を表示するには-例

msgbox(roundd(3.625))

これにより、3.63のメッセージボックスが表示されます

Textbox1.text = roundd(3.625)

これにより、textbox1.text --3.63などが設定されます。したがって、複数の数値を丸める必要がある場合は、それほど面倒ではなく、入力の手間を省くことができます。

お役に立てれば。

于 2013-02-12T15:05:31.373 に答える
-1

32.625のような数値がVB.Netで扱われるフロートを使用することはできません。(@StevenDoggartが言及しているように、Bankerの丸めの問題もあります。おそらく両方の問題に対処する必要があります。)

問題は、これらの数値が固定の2進表現にならないため、格納されている数値が正確に入力されていないことです。たとえば、32.625は32.62499997として格納され、32.635は32.63500001として格納されます。
正確にする唯一の方法は、数値をタイプDecimalとして格納することです。

DIM num as Decimal
num = ToDecimal("32.625")
于 2013-02-12T14:48:31.700 に答える