半浮動小数点数の四捨五入
Python のround() 関数は、半浮動小数点数を丸めるときに異常な動作を示し、混乱を招く可能性があります。この動作をさらに詳しく調べてみましょう。
<code class="python">for i in range(1, 15, 2): n = i / 2 print(n, "=>", round(n))</code>
このコードは次のように出力します。
0.5 => 0 1.5 => 2 2.5 => 2 3.5 => 4 4.5 => 4 5.5 => 6 6.5 => 6
予想に反して、浮動小数点値は常に切り上げられるわけではありません。代わりに、半分の値であっても、最も近い偶数に丸められます。この動作は、Python ドキュメントの「数値型」に記載されています:
"round(x[, n])
x は n 桁に丸められ、半分は偶数に丸められます。n が省略された場合、デフォルトは 0 です。
この最も近い偶数への丸めは「バンカー丸め」として知られ、丸めを平均化することで丸め誤差を軽減することを目的としています。
より詳細に制御するには丸め動作に関しては、10 進モジュールはより柔軟なアプローチを提供します。次の例は、10 進数モジュールを使用して半分から切り上げる方法を示しています。
<code class="python">from decimal import localcontext, Decimal, ROUND_HALF_UP with localcontext() as ctx: ctx.rounding = ROUND_HALF_UP for i in range(1, 15, 2): n = Decimal(i) / 2 print(n, '=>', n.to_integral_value())</code>
出力:
0.5 => 1 1.5 => 2 2.5 => 3 3.5 => 4 4.5 => 5 5.5 => 6 6.5 => 7
localcontext() 内で丸めパラメーターを調整することで、丸めをカスタマイズできます。必要に応じて動作を調整し、特定の丸めシナリオで正確な結果を保証します。
以上がPython が半浮動小数点数を偶数に丸めるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。