1. ホーム
  2. .net

[解決済み] Math.Round(2.5)はなぜ3でなく2を返すのですか?

2022-03-21 15:52:21

質問

C#では Math.Round(2.5) は2です。

本来は3なんですよね?C#ではなぜ2になっているのでしょうか?

どのように解決するのですか?

まず、これはC#のバグではなく、.NETのバグでしょう。C#は言語です。 Math.Round が実装されています。

そして第二に、いいえ - もしあなたが読むなら ドキュメント デフォルトの丸め方は、quot;round to even" (banker's rounding)であることがわかります。

<ブロッククオート

戻り値
タイプ System.Double
aに最も近い整数。 aの分数成分の半分が 2つの整数の間で、一方が 偶数と奇数の場合、偶数の が返される。ただし、この メソッドは Double の代わりに の積分型である。

備考
本メソッドの動作はIEEE規格754に準じます。 セクション4. このような丸め方は 四捨五入と呼ばれることもあります。 またはバンカーズ・ラウンディング これは という丸め誤差が発生します。 中点値の一貫した丸め を一方向に表示します。

の方法を指定することができます。 Math.Round を使用して中点を丸める必要があります。 オーバーロード これは MidpointRounding の値を指定します。を持つオーバーロードが1つあります。 MidpointRounding を持たない各オーバーロードに対応します。

このデフォルトがうまく選択されたかどうかは別問題です。( MidpointRounding は.NET 2.0から導入されたばかりです。それ以前は、望む動作を自分でやらずに実装する簡単な方法があったとは思えません)。特に、歴史が示しているのは 期待される ほとんどの場合、それはAPI設計の大罪です。私が見ることができるのは なぜ バンカーズ・ラウンディングは便利なのですが、まだ多くの人が驚いています。

最も近いJavaの同等のenumを見てみると面白いかもしれませんね( RoundingMode ) は、さらに多くのオプションを提供します。(中点だけを扱うわけではありません)。