부동값이 정수인지 확인하는 방법
나는 12,000보다 작은 정수인 가장 큰 세제곱근을 찾으려고 한다.
processing = True
n = 12000
while processing:
n -= 1
if n ** (1/3) == #checks to see if this has decimals or not
정수인지 아닌지 어떻게 확인해야 할지 모르겠어요!문자열로 변환한 후 인덱싱을 사용하여 끝 값을 확인하고 0인지 여부를 확인할 수 있습니다.그것은 다소 번거로운 일입니다.더 간단한 방법은 없나요?
플로트 값이 정수인지 확인하려면 다음 방법을 사용합니다.
>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False
은 서드 the the the the 에 추가되었다.float
Python 2.6을 입력합니다.
Python 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()
번호를 찾을 수 있습니다.rounding like의 .12000
:
>>> int(12000 ** (1.0/3))
22
>>> 22 ** 3
10648
Python 3.5 이후를 사용하는 경우 함수를 사용하여 부동 소수점 값이 구성 가능한 여백 내에 있는지 확인할 수 있습니다.
>>> 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를 몇 알 수 .x % y
모든 정수는 1로 나누어야 하므로, 나머지가 있는 경우 정수가 되어서는 안 됩니다.
을 반환합니다. 부울을 합니다.True
★★★★★★★★★★★★★★★★★」False
n
수입니니다다
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!")
어때.
if 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
위의 답변은 많은 경우에 효과가 있지만 일부 누락되어 있습니다.다음 사항을 고려하십시오.
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
isclose
Python 3.5+와 함께 제공되며, 다른 Python의 경우 거의 동일한 정의를 사용할 수 있습니다(해당 PEP에서 언급됨).
부차적인 정보일 뿐인데is_integer
는 내부 작업을 하고 있습니다.
import math
isInteger = (math.floor(x) == x)
python에서는 정확하게는 아니지만 cpython 구현은 위에서 설명한 바와 같이 구현됩니다.
모든 답은 좋지만 확실한 화재 방법은
def whole (n):
return (n*10)%10==0
이 함수는 정수일 경우 True를 반환합니다.그렇지 않으면 False...조금 늦은 건 알지만 내가 만든 재미있는 방법 중 하나가 있어...
편집: 아래 코멘트에 기재된 바와 같이 보다 저렴한 테스트는 다음과 같습니다.
def whole(n):
return n%1==0
다음과 같은 것을 사용할 수 있습니다.
num = 1.9899
bool(int(num)-num)
#returns True
True일 경우 값이 일정 수준이므로 정수가 아님을 의미합니다.또 다른
num = 1.0
bool(int(num)-num)
# returns False
>>> 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
>>>
이 문제는 해결되었습니다만, 수학에 근거한 펑션의 해법을 추가로 제안하고 싶습니다.
이 방법의 장점은 숫자의 정수 부분을 계산한다는 것입니다.일반 작업에 따라서는 이 방법이 도움이 될 수 있습니다.
알고리즘:
- 정수 부분을 분해하면 소수점 합계가 됩니다(예:
327=3*100+2*10+7*1
) - 계산된 정수와 그 자체의 차이를 구하다
- 차이가 정수로 간주될 수 있을 정도로 가까운지 여부를 결정한다.
from math import ceil, log, isclose
def is_whole(x: float) -> bool:
n_digits = ceil(log(x,10)) # number of digits of decimals at or above ones
digits = [(n//(10**i))%10 for i in range(n_digits)] # parse digits of `x` at or above ones decimal
whole = 0 # will equal the whole number part of `x`
for i in range(n_digits):
decimal = 10**i
digit = digits[i]
whole += digit*decimal
diff = whole - x
return isclose(diff, 0.0)
메모: 숫자의 숫자를 해석하는 아이디어는 여기서 실현되었습니다.
사용 방법:
int(val) == val
그것은 다른 어떤 방법보다 훨씬 더 정확할 것이다.
함수를 사용하여 값을 계산할 수 있습니다.
네, 큐브 루트의 값을 계산할 때 python에서는 약간의 오차가 있는 출력이 제공됩니다.값이 정수인지 확인하려면 다음 함수를 사용할 수 있습니다.
def cube_integer(n):
if round(n**(1.0/3.0))**3 == n:
return True
return False
단, 이 값은 이 값과 동등하며, 이 때문에 이 값을 얻을 수 있습니다.int(41063625**(1.0/3.0))
345가 아닌 344가 됩니다.
사용 시 주의하시기 바랍니다.int
입방근이다.
언급URL : https://stackoverflow.com/questions/21583758/how-to-check-if-a-float-value-is-a-whole-number
'programing' 카테고리의 다른 글
JSON의 RestTemplate를 통한 POST 요청 (0) | 2023.01.10 |
---|---|
사전 목록을 panda DataFrame으로 변환 (0) | 2022.12.26 |
C에서는 마이너스 어레이 인덱스를 사용할 수 있습니까? (0) | 2022.12.26 |
Mysql 테이블의 필드 설명 표시 (0) | 2022.12.26 |
MySQL의 server-id와 server_id의 차이 (0) | 2022.12.26 |