【问题标题】:Why round off of 0.500000 in python differs from 45.500000 using '%.0f'?为什么在 python 中舍入 0.500000 与使用 '%.0f' 的 45.500000 不同?
【发布时间】:2015-08-08 05:03:10
【问题描述】:

最近,我在 Python 2.7 中学习了字符串格式化的艺术。 我决定玩浮点数。
遇到了一个看起来很尴尬的解决方案,如下所示。

print "%.0f"%45.5000000 #46
print "%.0f"%0.5000000 #0

#Why??

但是

print int(round(45.5000000)) #46
print int(round(0.5000000)) #1

请帮助我理解,为什么%f会显示这种行为。

【问题讨论】:

    标签: python python-3.x python-2.7 string-formatting python-internals


    【解决方案1】:

    %.0f 字符串格式的内部实现使用round-half-even 舍入模式。

    在 Python 2 中,round() 函数使用round-away-from-zero。在 Python 3 中,was changed 将舍入一半,使其与字符串格式一致。

    FWIW,如果您想要比round() 或字符串格式提供的更多控制,decimal module 为您提供了舍入模式的选择。 decimal rounding modes 是:ROUND_05UP ROUND_CEILING ROUND_DOWN ROUND_FLOOR ROUND_HALF_DOWN ROUND_HALF_EVEN ROUND_HALF_UP ROUND_UP。

    【讨论】:

    • 你能解释一下“round-half-even”吗?特别是为什么它会产生 OPs 结果。
    • @Quirliom 查找“银行家四舍五入”,通过将 0.5 四舍五入到最接近的偶数将平均所有四舍五入值的总和以最正确。如果他们都汇总了数百万笔交易,那么总和会有很多错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多