13

我的代码:

  #!/usr/bin/python
  # -*- coding: utf-8 -*-
  print (round(1.555, 1))  # It seems normal
  print (round(1.555, 2))  # Why it is not output 1.56?
  print (round(1.556, 2))  # It seems normal

输出:

  sam@sam:~/code/python$ ./t2.py
  1.6
  1.55
  1.56
  sam@sam:~/code/python$

round(1.555, 1)输出1.6

为什么不round(1.555, 2)输出1.56

4

3 回答 3

18

看看文档

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

如果您继续挖掘(即单击该链接),您会发现一个与您的示例类似的示例:

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

2.67499999999999982236431605997495353221893310546875

字符串格式也不能解决您的问题。浮点数并没有按照您期望的方式存储:

>>> '{:0.2f}'.format(1.555)
'1.55'

这并不是真正的“修复”,但 Python 确实有一个decimal模块,该模块专为浮点运算而设计:

>>> from decimal import Decimal
>>> n = Decimal('1.555')
>>> round(n, 2)
Decimal('1.56')
于 2013-01-10T02:48:46.503 回答
6

直接来自文档:

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

于 2013-01-10T02:38:34.783 回答
0

来自http://docs.python.org/2/library/functions.html#round

笔记

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

于 2013-01-10T02:40:27.367 回答