【问题标题】:Behavior of "round" function in PythonPython中“round”函数的行为
【发布时间】:2013-03-21 20:29:31
【问题描述】:

谁能解释一下这段代码:

>>> round(0.45, 1)
0.5
>>> round(1.45, 1)
1.4
>>> round(2.45, 1)
2.5
>>> round(3.45, 1)
3.5
>>> round(4.45, 1)
4.5
>>> round(5.45, 1)
5.5
>>> round(6.45, 1)
6.5
>>> round(7.45, 1)
7.5
>>> round(8.45, 1)
8.4
>>> round(9.45, 1)
9.4

更新

我猜这是因为浮动表示。我说的对吗?

【问题讨论】:

标签: python python-3.x rounding


【解决方案1】:

你是对的。没有一个数字可以精确表示。在某些情况下,小数部分严格大于0.45,而在某些情况下则严格小于:

In [4]: ['%.20f' % val for val in (0.45, 1.45, 2.45, 3.45, 4.45, 5.45, 6.45, 7.45, 8.45, 9.45)]
Out[4]: 
['0.45000000000000001110',
 '1.44999999999999995559',
 '2.45000000000000017764',
 '3.45000000000000017764',
 '4.45000000000000017764',
 '5.45000000000000017764',
 '6.45000000000000017764',
 '7.45000000000000017764',
 '8.44999999999999928946',
 '9.44999999999999928946']

这解释了看似不一致的舍入。

【讨论】:

    【解决方案2】:

    正如 NPE 所说,十进制数的二进制表示不准确,所以你可以从四舍五入中得到奇怪的行为,解决这个问题的模块是十进制, Here is the official documentation

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多