10

私はPythonの初心者で、1つ質問があります。
5.5、7.5、(anything).5 のような数値の奇数部分のround(num)丸めは正しく機能するのに (ルール 5/4)、奇数以外の整数部分の (anything).5 のような数値の丸めは同じ関数によって返されるのはなぜですか?整数部?(しかし、その 10 進数に 0.000000001 のような小さな数値を追加すると、正しく機能します)

私は次のことを意味します:

round(9.5)

10 を返します。これは正しいです。しかし

round(8.5)

は 8 を返しますが、これは正しくありません。と

round(8.5 + 0.0000000000001)

9 を返します。

なぜ正しく動作しないのですか?
Windows で Python 3.2.2 を使用しています。

4

1 に答える 1

24

Python 3.x は、Python 2.x とは対照的に、関数にBanker の丸めround()を使用します。

これは文書化された動作です:

[I]2 つの倍数が等しく近い場合、丸めは偶数の選択に向けて行われます (たとえば、round(0.5) と round(-0.5) は両方とも 0 で、round(1.5) は 2 です)。

浮動小数点数はその性質上近似値にすぎないため、「正確な」半整数がどのように扱われるかはあまり重要ではありません。前の計算では常に丸め誤差が発生する可能性があります。

編集:古い丸め動作を取得するには、使用できます

def my_round(x):
    return int(x + math.copysign(0.5, x))
于 2012-04-10T17:50:04.927 に答える