半浮動小数点切り上げのジレンマ
round() 関数で奇妙なことに遭遇しましたか?次の動作を観察してください:
for i in range(1, 15, 2): n = i / 2 print(n, "=>", round(n))
浮動小数点値は一貫して切り上げられると予想されるかもしれませんが、驚くべきことに最も近い偶数に丸められます。
動作の背後にある理由
数値型のドキュメントでは、ステートメント「round(x[, n]) x を n 桁に丸め、半分を丸めて平。"これはバンカーズラウンドとして知られています。四捨五入誤差を増幅させる永続的な四捨五入の代わりに、バンカー四捨五入では、最も近い偶数をターゲットにすることで補正します。
制御された四捨五入のソリューション
四捨五入を正確に処理するには、10 進数モジュールを利用します。このモジュールには、特定の丸め戦略を指定するオプションが用意されています。たとえば、半分から切り上げるには:
>>> 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()) ... 0.5 => 1 1.5 => 2 2.5 => 3 3.5 => 4 4.5 => 5 5.5 => 6 6.5 => 7
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3