float check для значения is_integer не работает, как ожидалось? [Дубликат]

Говорят, что ваш list является List объектов, не указанных. Это значит, что Java не знает, какие объекты находятся внутри списка. Затем, когда вы хотите итерировать список, вы должны использовать каждый элемент, чтобы иметь доступ к свойствам этого элемента (в данном случае, String).

В общем, это лучшая идея параметризации коллекции , поэтому у вас нет проблем с преобразованием, вы сможете добавлять элементы параметризованного типа, и ваш редактор предложит вам подходящие методы.

private static List<String> list = new ArrayList<String>();
129
задан Martijn Pieters 5 February 2014 в 19:21
поделиться

11 ответов

Вышеупомянутые ответы работают во многих случаях, но они пропускают некоторые. Рассмотрим следующее:

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 )

221
ответ дан control_fd 21 August 2018 в 00:18
поделиться
  • 1
    Не зная питона, такого рода высказывания заставили бы меня нервничать, поскольку, по-видимому, требуется идеальная математика для работы в реальном мире. – Peter M 5 February 2014 в 19:16
  • 2
    @PeterM: метод действительно возвращает True, если вообще нет десятичных знаков. Разумеется, может быть недоразумение со стороны ОП относительно арифметики с плавающей запятой и точности. – Martijn Pieters♦ 5 February 2014 в 19:17
  • 3
    @MartijnPieters Да и один небольшой промах в вычислении с плавающей точкой, и внезапно у вас есть эти маленькие, нежелательные десятичные числа, такие как 0,00000000000000000001 – Peter M 5 February 2014 в 19:19
  • 4
    @PeterM: и представление по умолчанию будет округлено до 16 цифр; 1.0000000000000001 отображается как 1.0. – Martijn Pieters♦ 5 February 2014 в 19:21
  • 5
    math.fsum([0.1] * 10) == 1 – A-B-B 24 June 2016 в 04:37
  • 6
    @ AllDani.com: Я не уверен, что вы спрашиваете. 1.1 не является целым числом, поскольку десятичная часть не равна 0. – Martijn Pieters♦ 7 November 2016 в 23:24
241
ответ дан control_fd 31 October 2018 в 19:16
поделиться

Вы можете использовать функцию 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 с корнями куба.

Надежда I ответили на ваш вопрос. Если у вас есть другие запросы, вы можете связаться со мной .

0
ответ дан Anivarth 21 August 2018 в 00:18
поделиться

Как насчет

if x%1==0:
    print "is integer"
3
ответ дан Daniel 21 August 2018 в 00:18
поделиться

Вам не нужно зацикливать или проверять что-либо. Просто возьмите кубический корень из 12 000 и закруглите его:

r = int(12000**(1/3.0))
print r*r*r # 10648
6
ответ дан georg 21 August 2018 в 00:18
поделиться

Не было бы легче проверить корни куба? Начните с 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
5
ответ дан hughdbrown 21 August 2018 в 00:18
поделиться
  • 1
    Более того, поплавки имеют ошибки округления, так что вы можете пропустить число при вычислении, если n**(1/3) является целым числом. Например, на моем компьютере `10648 ** (1/3) = 21.999999999999996` вместо 22: проблема! При таком методе ответа такой проблемы нет. Я думаю, что это единственное правильное решение с математической точки зрения (другие решения Python-correct). – JPG 5 February 2014 в 19:16

Для этого вы можете использовать операцию modulo .

if (n ** (1.0/3)) % 1 != 0:
    print("We have a decimal number here!")
6
ответ дан Jakub Jirutka 21 August 2018 в 00:18
поделиться
  • 1
    если n равно 6.2, 6.0, 6.12312412, все мы имеем "We have a decimal number here!"? – Jay Wong 4 February 2016 в 12:02

Вы можете использовать это:

if k == int(k):
    print(str(k) + "is a whole number!"
11
ответ дан Juri Robl 21 August 2018 в 00:18
поделиться
  • 1
    он не работает для больших чисел , а .is_integer() продолжает работать. – jfs 19 October 2014 в 12:49
  • 2
    Ваша ссылка IMHO не показывает, что она не работает. Это просто показывает, что большие поплавки теряют точность. is_integer использует аналогичный метод (o = (floor(x) == x) ? Py_True : Py_False;). Но я согласен, следует использовать is_integer(), поскольку он намного яснее. – Juri Robl 19 October 2014 в 12:57
  • 3
    да. Это просто показывает, что большой float может потерять точность, то есть large_float == large_int может выйти из строя, даже если large_float == float(large_int). – jfs 19 October 2014 в 13:11
  • 4
    123456789012345678901234567890.0 != 123456789012345678901234567890, но 123456789012345678901234567890.0 == float(123456789012345678901234567890) – jfs 19 October 2014 в 13:33
  • 5
    Да, но k = 123456789012345678901234567890.0, тогда k == int(k) имеет значение True, что является правильным ответом. – Juri Robl 19 October 2014 в 13:35

Мы можем использовать оператор modulo (%). Это говорит нам, сколько остатков мы имеем, когда мы делим x на y - выражается как x % y. Каждое целое число должно делиться на 1, поэтому, если есть остаток, оно не должно быть целым числом.

Эта функция вернет логические значения, True или False, в зависимости от того, является ли n целым числом.

def is_whole(n):
    if n % 1 == 0:
        return True
    else:
        return False
12
ответ дан MagikCow 21 August 2018 в 00:18
поделиться
  • 1
    Переходя к основам, мне это нравится. Вы можете сделать return n % 1 == 0, чтобы сохранить некоторые строки. – antorqs 20 October 2017 в 09:05

Попробуйте использовать:

int(val) == val

Это даст намного больше точности, чем любые другие методы.

-1
ответ дан Tim Diekmann 21 August 2018 в 00:18
поделиться
  • 1
    Можете ли вы привести пример для резервного копирования утверждения о том, что «Это даст намного больше точности»? Это кажется необоснованным. – Mark Dickinson 25 July 2018 в 13:47

Только часть информации, is_integer делает внутренне:

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

Не совсем в python, но реализация cpython реализована, как указано выше.

0
ответ дан user1767754 21 August 2018 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: