Programing

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

crosscheck 2020. 5. 30. 09:21
반응형

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"

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

fl = sum([0.1]*10)  # this is 0.9999999999999999, but we want to say it IS an int

Using this as a benchmark, some of the other suggestions don't get the behavior we might want:

fl.is_integer() # False

fl % 1 == 0     # False

Instead try:

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))

now we get:

is_integer(fl)   # True

isclose comes with Python 3.5+, and for other Python's you can use this mostly equivalent definition (as mentioned in the corresponding PEP)


Just a side info, is_integer is doing internally:

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

Not exactly in python, but the cpython implementation is implemented as mentioned above.


All the answers are good but a sure fire method would be

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

The function returns True if it's a whole number else False....I know I'm a bit late but here's one of the interesting methods which I made...


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

Try using:

int(val) == val

It will give lot more precision than any other methods.


You can use the round function to compute the value.

Yes in python as many have pointed when we compute the value of a cube root, it will give you an output with a little bit of error. To check if the value is a whole number you can use the following function:

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

But remember that int(n) is equivalent to math.floor and because of this if you find the int(41063625**(1.0/3.0)) you will get 344 instead of 345.

So please be careful when using int withe cube roots.

참고URL : https://stackoverflow.com/questions/21583758/how-to-check-if-a-float-value-is-a-whole-number

반응형