为什么Python的圆形如此奇怪?

时间:2013-01-10 02:35:41

标签: python

我的代码:

  #!/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

3 个答案:

答案 0 :(得分:10)

看看the documentation

  

注意 round()对于浮点数的行为可能会令人惊讶:例如,round(2.675, 2)给出2.67而非预期   2.68。这不是一个错误:它是大多数十进制的结果   分数不能完全表示为浮点数。有关详细信息,请参阅 Floating Point Arithmetic: Issues and Limitations

如果你继续挖掘(即点击该链接),你会发现一个类似于你的例子:

  

内置round()函数的文档说明了这一点   舍入到最接近的值,从零开始四舍五入。自从   小数部分2.675恰好位于2.672.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')

答案 1 :(得分:6)

直接来自文档:

  

浮点数的round()行为可能会令人惊讶:例如,   round(2.675,2)给出2.67而不是预期的2.68。这不是一个   bug:这是大多数小数部分不能的结果   完全代表浮动。有关详细信息,请参阅Floating Point Arithmetic: Issues and Limitations

答案 2 :(得分:0)

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

请注意

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