[python] float 값이 정수인지 확인하는 방법

정수, 즉 12,000보다 작은 가장 큰 큐브 루트를 찾으려고합니다.

processing = True
n = 12000
while processing:
    n -= 1
    if n ** (1/3) == #checks to see if this has decimals or not

정수인지 아닌지 확인하는 방법을 잘 모르겠습니다! 문자열로 변환 한 다음 색인을 사용하여 최종 값을 확인하고 값이 0인지 여부를 확인하면 다소 번거로울 수 있습니다. 더 간단한 방법이 있습니까?



답변

float 값이 정수인지 확인하려면 다음 float.is_integer()방법을 사용하십시오 .

>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False

이 메소드는 floatPython 2.6 에서 유형에 추가되었습니다 .

파이썬 2 것을 고려 1/3이다 0(a는 (! 정수 피연산자 바닥 부문) 및 소수점 연산 부동 부정확가 될 수 있다는 float이진 분수, 사용하여 근사 하지 정확한 실수를). 그러나 루프를 약간 조정하면 다음이 제공됩니다.

>>> for n in range(12000, -1, -1):
...     if (n ** (1.0/3)).is_integer():
...         print n
... 
27
8
1
0

이는 앞에서 언급 한 부정확성으로 인해 3 큐브 이상 (10648 포함)이 누락되었음을 의미합니다.

>>> (4**3) ** (1.0/3)
3.9999999999999996
>>> 10648 ** (1.0/3)
21.999999999999996

대신 정수에 가까운 숫자를 확인 하거나 float()숫자를 찾는 데 사용하지 않아야합니다 . 큐브 루트를 반올림하는 것처럼 12000:

>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648

Python 3.5 이상을 사용하는 경우 math.isclose()함수 를 사용하여 부동 소수점 값이 구성 가능한 여백 내에 있는지 확인할 수 있습니다 .

>>> from math import isclose
>>> isclose((4**3) ** (1.0/3), 4)
True
>>> isclose(10648 ** (1.0/3), 22)
True

이전 버전의 경우 PEP485에 언급 된 대로 해당 기능의 순진한 구현 (오류 검사 건너 뛰기 및 무한대 및 NaN 무시) :

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)


답변

모듈로 (%) 연산자를 사용할 수 있습니다. 이것은 우리가 x를 y- 표현식으로 나눌 때 얼마나 많은 나머지를 가지고 있는지 알려줍니다 x % y. 모든 정수는 1로 나눠야하므로 나머지가 있으면 정수가 아니어야합니다.

이 함수는 정수 인지 여부에 따라 부울 True또는 을 반환합니다 .Falsen

def is_whole(n):
    return n % 1 == 0


답변

이것을 사용할 수 있습니다 :

if k == int(k):
    print(str(k) + " is a whole number!")


답변

루핑하거나 확인할 필요가 없습니다. 12,000의 큐브 루트를 가져 와서 반올림하십시오.

r = int(12000**(1/3.0))
print r*r*r # 10648


답변

이를 위해 모듈로 연산을 사용할 수 있습니다 .

if (n ** (1.0/3)) % 1 != 0:
    print("We have a decimal number here!")


답변

큐브 뿌리를 테스트하는 것이 쉽지 않습니까? 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


답변

어때요?

if x%1==0:
    print "is integer"