Как проверить, является ли значение float целым числом
Я пытаюсь найти самый большой кубический корень, который является целым числом, то есть менее 12 000.
processing = True
n = 12000
while processing:
n -= 1
if n ** (1/3) == #checks to see if this has decimals or not
Я не уверен, как проверить, является ли это целым числом или нет! Я мог бы преобразовать его в строку, а затем использовать индексирование, чтобы проверить конечные значения и посмотреть, являются ли они нулевыми или нет, что кажется довольно громоздким. Есть ли более простой способ?
Ответы
Ответ 1
Чтобы проверить, является ли значение float целым числом, используйте метод float.is_integer()
:
>>> (1.0).is_integer()
True
>>> (1.555).is_integer()
False
Этот метод был добавлен к типу 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()
, чтобы найти свой номер. Подобно округлению корня куба 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
Для более старых версий наивная реализация этой функции (пропуская проверку ошибок и игнорирование бесконечности и 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)
Ответ 2
Мы можем использовать оператор по модулю (%). Это говорит нам, сколько у нас осталось, когда мы делим x на y - выражается как x % y
. Каждое целое число должно делиться на 1, поэтому, если есть остаток, он не должен быть целым числом.
Эта функция будет возвращать логическое значение, True
или False
, в зависимости от того, является ли n
целым числом.
def is_whole(n):
return n % 1 == 0
Ответ 3
Вы можете использовать это:
if k == int(k):
print(str(k) + " is a whole number!")
Ответ 4
Вам не нужно зацикливать или проверять что-либо. Просто возьмите кубический корень из 12 000 и закруглите его:
r = int(12000**(1/3.0))
print r*r*r # 10648
Ответ 5
Вы можете использовать операцию по модулю для этого.
if (n ** (1.0/3)) % 1 != 0:
print("We have a decimal number here!")
Ответ 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
Ответ 7
Как насчет
if x%1==0:
print "is integer"
Ответ 8
Вышеупомянутые ответы работают во многих случаях, но они пропускают некоторые. Рассмотрим следующее:
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)
Ответ 9
Просто дополнительная информация, is_integer
делает внутренне:
import math
isInteger = (math.floor(x) == x)
Не совсем в Python, но реализация cpython реализована, как указано выше.
Ответ 10
Все ответы хорошие, но надежный метод стрельбы был бы
def whole (n):
return (n*10)%10==0
Функция возвращает True, если это целое число, иначе False.... Я знаю, что немного опоздал, но вот один из интересных методов, которые я сделал...
Ответ 11
>>> 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
>>>
Ответ 12
Вы можете использовать функцию round
для вычисления значения.
Да, в python, как указывали многие, когда мы вычисляем значение корня куба, он выдаст вам вывод с небольшой ошибкой. Чтобы проверить, является ли значение целым числом, вы можете использовать следующую функцию:
def cube_integer(n):
if round(n**(1.0/3.0))**3 == n:
return True
return False
Но помните, что int(n)
эквивалентен math.floor
и поэтому, если вы найдете int(41063625**(1.0/3.0))
вы получите 344 вместо 345.
Поэтому, пожалуйста, будьте осторожны при использовании int
кубическими корнями.
Ответ 13
Попробуйте использовать:
int(val) == val
Это даст гораздо больше точности, чем любые другие методы.