为什么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中,它是安全的,因为/
总是浮点除法。