1. ホーム
  2. パイソン

[解決済み】Python 3.xの丸め動作について

2022-04-08 07:25:28

質問

を読み直したところです。 Python 3.0の新機能について と記載があります。

round() 関数の丸め方と戻り値の型が変更されました。 完全に半分の場合は、最も近い偶数番目の結果に丸められるようになりました。 はゼロから離れる。(例えば、round(2.5) が返すのは2ではなく 3.)

と のドキュメントは ラウンド :

round() をサポートする組み込み型では、値は次のように丸められます。 10のマイナスn乗の最も近い倍数です。 同じように近い場合は、偶数選択で丸められます。

ということで、以下 v2.7.3 :

In [85]: round(2.5)
Out[85]: 3.0

In [86]: round(3.5)
Out[86]: 4.0

という感じです。しかし、現在 v3.2.3 :

In [32]: round(2.5)
Out[32]: 2

In [33]: round(3.5)
Out[33]: 4

これは直感的でなく、私が理解していることに反しているようです。 丸め(そして、人をつまずかせることになる)。英語は私の母国語ではありませんが これを読むまで、丸めの意味を知っているつもりでした :-)。 v3が導入されたときに、何らかの議論があったはずです。 が、検索しても正当な理由が見つかりませんでした。

  1. なぜこのように変更されたのか、どなたかお分かりになる方はいらっしゃいますか?
  2. 他に主流のプログラミング言語(例. C、C++、Java、Perl。 このような(私には一貫性のない)丸め方をするものはありますか?

何が足りないのでしょうか?

UPDATE @Li-aungYipさんのコメント re "Banker's rounding" から正しい検索語・キーワードをいただき、このSO問を見つけました。 なぜ.NETはデフォルトでバンカーズ・ラウンディングを使用するのですか? ということで、じっくりと読ませていただきます。

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

Python 3 の方法(" と呼ばれる。 半分を偶数にする は、最近の標準的な丸め方式と考えられていますが、言語によってはまだバスに乗っていない実装もあります。

シンプルな「" 常に0.5切り上げ "テクニックは、高い方の数値に若干の偏りが生じます。大量の計算を行う場合、これは大きな問題となります。Python 3.0のアプローチでは、この問題が解消されます。

一般的に使われている丸めの方法は1つだけではありません。浮動小数点演算の国際標準である IEEE 754 では、以下のように定義されています。 5種類の丸め方 (Python 3.0ではデフォルトで使用されています)。そして その他にも .

この動作は、それほど広く知られているわけではありません。AppleScriptは、私の記憶が正しければ、この丸め方式を早くから採用していました。その round コマンドを使用します。 にはいくつかのオプションがありますが、IEEE754と同じようにround-toward-evenがデフォルトです。を実装したエンジニアは round コマンドは、「学校で習ったように動作させてほしい」という要望が多く、うんざりしていたので、まさにそれを実現したのです。 round 2.5 rounding as taught in school は有効なAppleScriptコマンドです :-)