半浮点数舍入困境
使用 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