为什么Python的math.ceil()和math.floor()操作返回的是浮点数而不是整数?

有人可以解释这个(直接从文档 – 重点我):

math.ceil(x)返回x的上限作为float ,最小的数值大于或等于x。

math.floor(x) 以floatforms返回x的floor,最大的数值小于或等于x。

为什么当.ceil.floor按照定义计算整数时会返回浮动数据?


编辑:

那么,为什么他们应该返回浮动数据呢,我得到了一些非常好的理由,我刚刚习惯了这个想法, @ jcollado指出他们实际上在Python 3中返回整数。

浮点数的范围通常超出整数的范围。 通过返回一个浮点值,这些函数可以返回一个合理的值,用于位于可表示的整数范围之外的input值。

考虑:如果floor()返回一个整数,那么floor(1.0e30)返回什么?

现在,虽然Python的整数现在是任意的精度,但并不总是这样。 标准的库函数是相当于C库函数的简洁包装。

正如其他答案所指出的那样,在python中,它们返回浮动可能是由于历史原因,以防止溢出问题。 但是,他们返回Python中的整数3。

 >>> import math >>> type(math.floor(3.1)) <class 'int'> >>> type(math.ceil(3.1)) <class 'int'> 

您可以在PEP 3141中find更多信息。

因为python的math库是Cmath库的一个薄包装,它返回浮点数。

您的评论显示了您的困惑之源:

ceil / floor操作的要点就是将浮点数转换为整数!

ceil和floor操作的要点是将浮点数据整理为整数值 。 不要做types转换。 需要获取数值的用户可以在操作之后执行显式转换。

请注意,如果所有可用的都是返回整数的ceil或float操作,则不可能将整数值实现为平凡值。 您需要首先检查input是否在可表示的整数范围内,然后调用该函数; 你需要在一个独立的代码path中处理NaN和infinities。

此外,如果要符合IEEE 754 ,则必须具有返回浮点数的ceil和floor的版本。

在Python 2.4之前,一个整数不能保存截断实数的全部范围。

http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers

因为浮点数的范围大于整数的范围 – 返回一个整数可能会溢出

这是一个非常有趣的问题! 由于浮点数需要一些位来存储指数(= bits_for_exponent ),任何大于2**(float_size - bits_for_exponent)将始终是一个整数值! 在另一极端,具有负指数的浮动将给出0-1 。 这使得整数范围浮点范围模拟的讨论,因为只要数字在整数types的范围之外,这些函数将简单地返回原始数字。 python函数是C函数的包装器,所以这实际上是C函数的一个缺陷,他们应该返回一个整数,并在调用ceil / floor之前强制程序员进行范围/ NaN / Inf检查。

因此,逻辑答案是这些函数唯一有用的时候,他们会返回一个整数范围内的值,所以他们返回一个浮点数是一个错误 ,你很聪明,实现这一点!

也许是因为其他语言也这样做,所以这是普遍接受的行为。 (出于好的原因,如其他答案所示)

否则,你不能这样做。

 math.floor(23.45678 * 1000) / 1000 

如果math.floor将在Python 2中返回整数,则返回23 ,而不是23.456 。 在Python 3中,它是安全的,因为/总是浮点除法。