我正在尝试找到最大的立方根整数,它小于12000。
processing = True
n = 12000
while processing:
n -= 1
if n ** (1/3) == #checks to see if this has decimals or not
不过我不确定如何检查它是否为整数!我可以将其转换为字符串,然后使用索引来检查末尾的值并查看它们是否为零,但这似乎相当麻烦。有更简单的方法吗?
我正在尝试找到最大的立方根整数,它小于12000。
processing = True
n = 12000
while processing:
n -= 1
if n ** (1/3) == #checks to see if this has decimals or not
不过我不确定如何检查它是否为整数!我可以将其转换为字符串,然后使用索引来检查末尾的值并查看它们是否为零,但这似乎相当麻烦。有更简单的方法吗?
要检查浮点数是否为整数,请使用float.is_integer()
方法:
>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False
>>> for n in range(12000, -1, -1):
... if (n ** (1.0/3)).is_integer():
... print n
...
27
8
1
0
>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996
你需要检查接近整数的数字,或者不使用float()
来找到你的数字。比如将12000
的立方根向下取整:
>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648
math.isclose()
函数来判断浮点数值是否在可配置的范围内:>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True
对于旧版本,该函数的朴素实现(跳过错误检查并忽略无穷大和NaN),如在PEP485中提到:
def isclose(a, b, rel_tol=1e-9, abs_tol=0.0):
return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
isinstance(x, int) or x.is_integer()
或float(x).is_integer()
。但没关系,我可以接受这些解决方案! - Billx % y
。每个整数必须被1整除,所以如果有余数,它就不是一个整数。True
或False
,取决于n
是否为整数。def is_whole(n):
return n % 1 == 0
n
恰好是整数的情况。而被接受的答案在这种情况下会失败。 - emilaz你可以使用这个:
if k == int(k):
print(str(k) + " is a whole number!")
.is_integer()
仍然可以工作。 - jfsis_integer
使用了类似的方法(o = (floor(x) == x) ? Py_True : Py_False;
)。但我同意,应该使用is_integer()
,因为它更清晰易懂。 - Juri Robllarge_float == float(large_int)
也可能失败。 - jfsk = 123456789012345678901234567890.0
,则 k == int(k)
的结果为 True,这是正确的答案。 - Juri Robl你不需要循环或检查任何内容。只需取12000的立方根并将其向下舍入:
r = int(12000**(1/3.0))
print r*r*r # 10648
n
是 6.2、6.0、6.12312412 中的任意一个,我们都会得到 "We have a decimal number here!"
吗? - Jay Wangif x%1==0:
print "is integer"
测试立方根不是更容易吗?从20(20**3 = 8000)开始,一直到30(30**3 = 27000)。然后您只需要测试少于10个整数。
for i in range(20, 30):
print("Trying {0}".format(i))
if i ** 3 > 12000:
print("Maximum integral cube root less than 12000: {0}".format(i - 1))
break
n**(1/3)
是否为整数时可能会错过数字。例如,在我的计算机上,10648**(1/3)=21.999999999999996
而不是 22
:有问题!使用这个答案的方法就没有这样的问题。我认为这是从数学角度来看唯一正确的解决方案(其他解决方案在 Python 中是正确的)。 - JPGfl = sum([0.1]*10) # this is 0.9999999999999999, but we want to say it IS an int
fl.is_integer() # False
fl % 1 == 0 # False
相反尝试:
def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
def is_integer(fl):
return isclose(fl, round(fl))
现在我们得到:
is_integer(fl) # True
isclose
是 Python 3.5+ 中的函数,对于其他版本的 Python,您可以使用与相应 PEP 中提到的大致等效的定义。
math.fsum([0.1] * 10) == 1
- Asclepius顺便提一下,is_integer
内部实际上是这样做的:
import math
isInteger = (math.floor(x) == x)
您可以使用类似以下的代码:
num = 1.9899
bool(int(num)-num)
#returns True
num = 1.0
bool(int(num)-num)
# returns False
int(12000**(1/3))**3
进行计算。 - qwr