【问题标题】:How to deal with the ending 5 in a decimal fraction when round it四舍五入时如何处理小数部分的结尾5
【发布时间】:2014-07-20 15:34:14
【问题描述】:

我用python对浮点数进行四舍五入,我对计算机如何四舍五入感到困惑。例如:

round(1.55, 1) = 1.6 # this is what I would expect; however
round(1.65, 1) = 1.6 #this is what confuses me. Is it supposed to be 1.7?

另一个例子:

round(1.85, 1) = 1.9
round(1.95, 1) = 1.9

我猜这可能与二进制和十进制之间的转换有关。我的问题是我怎么知道结尾 5 是否会被省略?非常感谢您的帮助!

【问题讨论】:

  • Python 使用banker's rounding。这是 IEEE 754 计算函数和运算符中使用的默认舍入模式。
  • 你读过the docs吗?有一个关于这个问题的注释。
  • @MarkRansom 很有趣。我必须调查一下,但我怀疑 1.5 实际上是 1.499999999... 所以会舍入到 1 但我必须做一些调查。
  • 非常感谢你们,伙计们。我阅读了文档并了解到您可以导入十进制模块,然后在您有疑问时使用 Decimal(Your number) 来检查确切的值。这真的很有帮助。
  • @Cyber​​:Python 2.7 将平局从零开始。只有 Python 3.x 将平局打平。 (Python 2.6 及更早版本没有正确舍入的舍入函数,因此中途情况的行为是不可预测的。)1.5 正好是 1.5。

标签: python math


【解决方案1】:

documentation 描述了为什么会发生这种行为:

注意 浮点数的 round() 行为可能令人惊讶:例如, round(2.675, 2) 给出 2.67 而不是预期的 2.68。这不是一个 错误:这是因为大多数小数不能是 完全表示为浮点数。请参阅浮点算术:问题 和限制了解更多信息。

相关但超出此问题的范围,Floating Point Arithmetic limitations 也是一个不错的读物。

从该页面,问题被扩展为:

内置 round() 函数的文档说它 舍入到最接近的值,从零舍入关系。由于 小数 2.675 正好在 2.67 和 2.68 之间,你 可能期望这里的结果是(二进制近似)2.68。 不是,因为当十进制字符串 2.675 转换为 二进制浮点数,它再次被二进制替换 近似值,其精确值为

2.67499999999999982236431605997495353221893310546875

由于这个近似值比 2.68 更接近 2.67,因此向下舍入。

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2023-01-12
    相关资源
    最近更新 更多