有人能解释一下(直接来自docs - 强调我的):
math.ceil(x)将x的上限返回为float,即大于或等于x的最小整数值 . math.floor(x)将x的底限作为float返回,最大整数值小于或等于x .
为什么 .ceil 和 .floor 根据定义应该计算整数时返回浮点数?
.ceil
.floor
EDIT:
好吧,这有一个非常好的论据,为什么他们应该返回浮点数,我只是习惯了这个想法,当@jcollado指出他们实际上确实在Python 3中返回了内容...
在Python 2.4之前,整数不能保存截断实数的全部范围 .
http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers
因为浮点数的范围大于整数的范围 - 返回一个整数可能会溢出
浮点数的范围通常超出整数范围 . 通过返回浮点值,函数可以为位于可表示的整数范围之外的输入值返回合理值 .
考虑一下:如果 floor() 返回一个整数, floor(1.0e30) 应该返回什么?
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中找到更多信息 .
因为python的数学库是C数学库的一个薄包装器,它返回浮点数 .
您的评论中可以看出您混淆的根源:
ceil / floor操作的重点是将浮点数转换为整数!
ceil和floor操作的要点是将浮点数据舍入为整数值 . 不要进行类型转换 . 需要获取整数值的用户可以在操作后进行显式转换 .
请注意,如果所有可用的都是返回整数的ceil或float操作,则不可能像往常一样实现舍入到整数值 . 您需要首先检查输入是否在可表示的整数范围内,然后调用该函数;您需要在单独的代码路径中处理NaN和无穷大 .
此外,如果要符合IEEE 754,则必须具有返回浮点数的ceil和floor版本 .
这是一个非常有趣的问题!由于float需要一些位来存储指数(= bits_for_exponent ),任何大于 2**(float_size - bits_for_exponent) 的浮点数始终是一个整数值!在另一个极端,具有负指数的浮点数将给出 1 , 0 或 -1 之一 . 这使得对 integer range 与 float range 的讨论没有实际意义,因为只要数字超出整数类型的范围,这些函数就会返回原始数字 . python函数是 C 函数的包装器,所以这实际上是 C 函数的缺陷,它们应该返回一个整数并强制程序员在调用ceil / floor之前执行范围/ NaN / Inf 检查 .
bits_for_exponent
2**(float_size - bits_for_exponent)
1
0
-1
C
NaN
Inf
因此,逻辑答案是这些函数唯一有用的时候它们会在整数范围内返回一个值,因此它们返回一个浮点数的事实是 mistake ,你很聪明地意识到这一点!
也许是因为其他语言也这样做,所以它通常是被接受的行为 . (有充分理由,如其他答案所示)
8 回答
在Python 2.4之前,整数不能保存截断实数的全部范围 .
http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers
因为浮点数的范围大于整数的范围 - 返回一个整数可能会溢出
浮点数的范围通常超出整数范围 . 通过返回浮点值,函数可以为位于可表示的整数范围之外的输入值返回合理值 .
考虑一下:如果
floor()
返回一个整数,floor(1.0e30)
应该返回什么?现在,虽然Python的整数现在是任意精度,但并不总是这样 . 标准库函数是等效C库函数周围的瘦包装器 .
正如其他答案所指出的,在python中,他们返回浮点数可能是因为历史原因可以防止溢出问题 . 但是,它们在python 3中返回整数 .
您可以在PEP 3141中找到更多信息 .
因为python的数学库是C数学库的一个薄包装器,它返回浮点数 .
您的评论中可以看出您混淆的根源:
ceil和floor操作的要点是将浮点数据舍入为整数值 . 不要进行类型转换 . 需要获取整数值的用户可以在操作后进行显式转换 .
请注意,如果所有可用的都是返回整数的ceil或float操作,则不可能像往常一样实现舍入到整数值 . 您需要首先检查输入是否在可表示的整数范围内,然后调用该函数;您需要在单独的代码路径中处理NaN和无穷大 .
此外,如果要符合IEEE 754,则必须具有返回浮点数的ceil和floor版本 .
这是一个非常有趣的问题!由于float需要一些位来存储指数(=
bits_for_exponent
),任何大于2**(float_size - bits_for_exponent)
的浮点数始终是一个整数值!在另一个极端,具有负指数的浮点数将给出1
,0
或-1
之一 . 这使得对 integer range 与 float range 的讨论没有实际意义,因为只要数字超出整数类型的范围,这些函数就会返回原始数字 . python函数是C
函数的包装器,所以这实际上是C
函数的缺陷,它们应该返回一个整数并强制程序员在调用ceil / floor之前执行范围/NaN
/Inf
检查 .因此,逻辑答案是这些函数唯一有用的时候它们会在整数范围内返回一个值,因此它们返回一个浮点数的事实是 mistake ,你很聪明地意识到这一点!
也许是因为其他语言也这样做,所以它通常是被接受的行为 . (有充分理由,如其他答案所示)