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


202

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

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

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


3
그것은 큐브 루트 n-> (n * n * n <12000)에서 작업하기가 더 쉬울 것입니다.
suspectus

답변:


366

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)

파이썬을 알지 못한다면, 이런 종류의 진술은 실제 세계에서 작동하기 위해 완벽한 수학이 필요한 것처럼 보이기 때문에 긴장합니다.
Peter M

1
@PeterM :이 메소드 True는 소수가 전혀없는 경우 에만 반환 합니다. 물론 부동 소수점 산술 및 정밀도에 대한 OP 부분에 대한 오해가있을 수 있습니다.
Martijn Pieters

1
@MartijnPieters 그래, 부동 소수점 계산에서 하나의 작은 미끄러짐과 갑자기 당신은 0.00000000000000000001과 같은이 작고 원치 않는 소수를가집니다
Peter M

1
@PeterM : Python 2에서는 기본 표현이 16 자리로 반올림됩니다. 1.0000000000000001표시되는 1.03에 도시 된 것과 동일한 값을 생성 짧은 문자열 표현.
Martijn Pieters

다음 range(12000, -1, -1)과 같이 다시 쓸 수 있습니다. (imo,보다 깨끗하게)reversed(range(12000+1))
cs95

36

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

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

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

15

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

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

5
더 큰 숫자는 실패 하지만 .is_integer()계속 작동합니다.
jfs

링크 IMHO가 작동하지 않는 것으로 표시되지 않습니다. 단지 큰 수레가 정밀도를 잃는다는 것을 보여줍니다. is_integer비슷한 방법 ( o = (floor(x) == x) ? Py_True : Py_False;)을 사용합니다 . 그러나 나는 is_integer()훨씬 분명 하기 때문에 사용해야한다는 데 동의합니다 .
Juri Robl

1
예. 대형 플로트, 정밀 즉 유실 될 수 있음 그것은 단지 쇼 large_float == large_int경우에도 실패 할 수 있습니다 large_float == float(large_int).
jfs

2
123456789012345678901234567890.0 != 123456789012345678901234567890하지만123456789012345678901234567890.0 == float(123456789012345678901234567890)
jfs

2
그래,하지만 k = 123456789012345678901234567890.0다음 k == int(k)정답 사실이다.
Juri Robl

9

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

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

이것은 합리적인 답변입니다.
hughdbrown

7

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

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

2
경우 n6.2이며, 6.0, 6.12312412, 우리 모두가 "We have a decimal number here!"?
Jay Wong

@JayWong 테스트를로드 한 방법을 모르지만 Python3.7을 사용하여 내 컴퓨터에서 제대로 작동합니다.
Zchpyvr

6

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

1
또한 부동 소수점에는 반올림 오류가 있으므로 n**(1/3)정수를 계산할 때 숫자를 놓칠 수 있습니다 . 예를 들어 내 컴퓨터에서`10648 ** (1/3) = 21.999999999999996`대신에 22: problem! 이 답변의 방법으로는 그러한 문제가 없습니다. 나는 이것이 수학 관점에서 유일하게 올바른 솔루션이라고 생각합니다 (다른 솔루션은 Python이 맞습니다).
JPG


3

위의 답변은 많은 경우에 효과가 있지만 일부는 누락되었습니다. 다음을 고려하세요:

fl = 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

isclosePython 3.5+ 와 함께 제공되며 다른 Python의 경우 이와 동등한 정의를 사용할 수 있습니다 (해당 PEP 에서 언급 한 것처럼 )


1
math.fsum([0.1] * 10) == 1
Acumenus 2018 년

1

부수적 인 정보 is_integer는 내부적으로 수행하는 것입니다.

import math
isInteger = (math.floor(x) == x)

정확히 파이썬에서는 아니지만 위에서 언급 한 것처럼 cpython 구현이 구현됩니다.


1

모든 답변은 훌륭하지만 확실한 발사 방법은

def whole (n):
     return (n*10)%10==0

함수는 정수가 아닌 경우 True를 반환하고 False입니다 .... 나는 조금 늦었지만 알고있는 흥미로운 방법 중 하나입니다 ...

편집 : 아래 의견에서 언급했듯이 더 저렴한 동등한 테스트는 다음과 같습니다.

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

1
이것은 기능적으로 다르지 않아야합니다 n % 1 == 0. 이 경우 저렴한 동등한 테스트를 위해 더 비싼 두 가지 작업을 수행하고 있습니다.
Zchpyvr

0
>>> def is_near_integer(n, precision=8, get_integer=False):
...     if get_integer:
...         return int(round(n, precision))
...     else:
...         return round(n) == round(n, precision)
...
>>> print(is_near_integer(10648 ** (1.0/3)))
True
>>> print(is_near_integer(10648 ** (1.0/3), get_integer=True))
22
>>> for i in [4.9, 5.1, 4.99, 5.01, 4.999, 5.001, 4.9999, 5.0001, 4.99999, 5.000
01, 4.999999, 5.000001]:
...     print(i, is_near_integer(i, 4))
...
4.9 False
5.1 False
4.99 False
5.01 False
4.999 False
5.001 False
4.9999 False
5.0001 False
4.99999 True
5.00001 True
4.999999 True
5.000001 True
>>>

다음은 좋은 답변을 작성하는 방법에 대한 몇 가지 지침입니다 . . 이 답변은 정확할 수도 있지만 설명이 도움이 될 수 있습니다. 코드 전용 답변은 "좋은"답변으로 간주되지 않습니다. 에서 검토 .
Trenton McKinney

-1

다음을 사용하십시오.

int(val) == val

다른 방법보다 훨씬 더 정밀합니다.


"더 많은 정밀도를 제공 할 것"이라는 주장을 뒷받침하는 예를 들어 줄 수 있습니까? 근거가없는 것 같습니다.
Mark Dickinson

-1

round함수를 사용하여 값을 계산할 수 있습니다 .

파이썬에서 큐브 루트의 값을 계산할 때 많은 사람들이 지적한 것처럼 약간의 오류가있는 출력을 제공합니다. 값이 정수인지 확인하려면 다음 함수를 사용할 수 있습니다.

def cube_integer(n):
    if round(n**(1.0/3.0))**3 == n:
        return True
    return False

그러나 이것이 당신 과 345 대신 344를 얻는다는 것을 발견하면 이것과 int(n)동등 하다는 것을 기억하십시오 .math.floorint(41063625**(1.0/3.0))

따라서 int큐브 뿌리와 함께 사용할 때주의하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.