C# では、結果はMath.Round(2.5)
2 になります。
3 であるはずですが、なぜ C# では 2 なのでしょうか?
ベストアンサー1
まず、これは C# のバグではなく、.NET のバグです。C# は言語であり、Math.Round
実装方法を決定するものではありません。
そして第二に、いいえ、もしあなたがドキュメントデフォルトの丸めは「偶数に丸める」(銀行型丸め)であることがわかります。
戻り値の
型: System.Double
a に最も近い整数。a の小数部分が 2 つの整数 (一方が偶数でもう一方が奇数) の中間にある場合は、偶数が返されます。このメソッドはDouble
整数型ではなく a を返すことに注意してください。注釈
このメソッドの動作は、IEEE 標準 754、セクション 4 に従います。この種類の丸めは、最も近い値への丸め、または銀行型丸めと呼ばれることもあります。これにより、中間値を一貫して単一方向に丸めることで生じる丸め誤差が最小限に抑えられます。
Math.Round
中間点をどのように丸めるかを指定するには、過負荷これはMidpointRounding
MidpointRounding
値。値を持たないオーバーロードのそれぞれに対応する を持つオーバーロードが 1 つあります。
Round(Decimal)
/Round(Decimal, MidpointRounding)
Round(Double)
/Round(Double, MidpointRounding)
Round(Decimal, Int32)
/Round(Decimal, Int32, MidpointRounding)
Round(Double, Int32)
/Round(Double, Int32, MidpointRounding)
このデフォルトが適切に選択されたかどうかは別の問題です。(MidpointRounding
は .NET 2.0 でのみ導入されました。それ以前は、自分で実行せずに目的の動作を実装する簡単な方法があったかどうかはわかりません。) 特に、歴史はそれが期待された動作ではないことを示しています。そしてほとんどの場合、それは API 設計における大罪です。銀行家の丸めがなぜ役立つのかはわかりますが、それでも多くの人にとって驚きです。
最も近いJavaの同等の列挙型(RoundingMode
) では、さらに多くのオプションが提供されます。(中間点だけを扱うのではありません。)