如果x
为2.3
,则math.floor(x)
会返回2.0
,这是小于或等于x
的最大整数(作为浮动。)
如何让i
最大整数严格小于x
(作为整数)?
我想出的最好的是:
i = int(math.ceil(x)-1)
有更好的方法吗?
请注意,如果x
为2.0
,则math.floor(x)
会返回2.0
,但我需要的最大整数小于2.0
,即1
}。
答案 0 :(得分:3)
math.ceil(x)-1
是正确的,这是证据。
如果x
位于 Z (整数集)中,则math.ceil(x)
= x
。因此math.ceil(x)-1
= x-1
是小于x
的最大整数。
否则我们在 R \ Z 中有x
,而math.ceil(x)
是y
的最小整数x
}≤y
。但是y-1
是一个小于最小整数的整数,x
≤y
,因此x
> y-1
和构造y-1
是最大的小于x
的整数。
这很简单,我不会为那些if
- else
而烦恼。但为了避免使用浮点数计算错误,我会在-1
转换之外执行int
。
int(math.ceil(x))-1
答案 1 :(得分:1)
以下C代码在某种意义上有效 - 它为您提供了可表示为浮点数的下一个最负的整数:
double flooor(double x) {
return floor(nextafter(x, -1.0/0.0));
}
以下Python代码是直接音译,但它依赖于NumPy:
def flooor(x):
return math.floor(numpy.nextafter(x, -numpy.inf))
nextafter
函数从第一个参数double
移动到第二个参数。它有一个特例;如果z < 0
并且您要求nextafter(0.0, z)
,则会返回最小的负次正规数。
从你的规范来看,目前还不清楚应该用正无穷大和最负的有限数来做什么。此代码将正无穷大发送到最正的有限数,负无穷大到自身,最负负有限数到负无穷大。
Martijn Pieters在答案中给出了咒语int(math.ceil(x)) - 1
,因为已删除。这正确地找到小于int
float
的最大x
。这会将x
向上舍入,将其转换为整数,并减去1,从而使最大的Python int
在数值上小于x
。
答案 2 :(得分:-2)
怎么样:
i = int(math.floor(x) - 1)