半浮點數舍入困境
使用 round() 函數遇到奇怪的情況?觀察以下行為:
for i in range(1, 15, 2): n = i / 2 print(n, "=>", round(n))
您可能期望浮點值始終向上舍入,但令人驚訝的是它們舍入到最接近的偶數。
行為背後的原因
數位類型的文件透過聲明「round(x[, n]) x四捨五入到n位數,四捨五入到一半來澄清這種特殊行為甚至。銀行家舍入不是持續向上或向下舍入,這會放大捨入誤差,而是透過瞄準最接近的偶數來補償。
受控舍入解決方案
精確處理舍入,利用十進位模組。此模組為您提供了指定特定舍入策略的選項。例如,要從一半向上捨入:
>>> 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