Есть ли разница между (i) и (int (i)

#python #casting #floating-point

Вопрос:

Может кто-нибудь объяснить мне этот код и почему он печатает то, что печатает

 def the_decimal(i):
    if i - int(i) != 0:
        return i - int(i)
    else:
        return 'INTEGER' 


print(the_decimal(99.1))
print(the_decimal(99.0))
 

Комментарии:

1. О какой конкретной строке вам неясно? В основном проверяется, float имеет ли какое-либо ненулевое десятичное значение, если нет, оно численно эквивалентно целому числу.

2. Понимаете ли вы, что вызов int числа с плавающей запятой возвращает целочисленную часть? Итак int(99.1) , возвращает 99. int(99.0) возвращает также 99. Несмотря на то, что 99.0 является числом с плавающей запятой, оно имеет целочисленное значение.

3. @zenmaster777 Добро пожаловать в SO. Пожалуйста, прочтите приведение типов в python для получения подробной информации о том, что вы хотите понять. Поскольку это слишком простой и общий вопрос для переполнения стека, я голосую за закрытие .

4. я думаю, что смысл, который вы пытаетесь донести, заключается в том, чтобы «напечатать(99.1 — 99)’ —> 0.09999999999999432 а не 0.1, как в не вычислительном мире

5. попробуйте —> вернуть раунд((i — int(i)),2)

Ответ №1:

Происходят две вещи:

  1. 99.1 неявно преобразуется в число с плавающей запятой, которое по своей конструкции является неточным, что приводит к повторному десятичному выводу (в Python3.8 я получаю 0.099999999999999432
  2. Вычитание происходит между десятичным и целочисленным представлением этого десятичного числа (по существу, округление до целого числа), которое, конечно, не будет равно нулю.

Итак, хотя число 2 довольно очевидно, потому 99.1 - 99 <> 0 что число 1 связано с неявным приведением к значению с плавающей точкой, приводящему к нечетному выводу, где можно было бы ожидать увидеть только 0.1.

Чтобы убедиться в этом самостоятельно, вы можете добавить print(type(i)) up в функцию:

 def the_decimal(i):
    print(type(i))
    if i - int(i) != 0:
        return i - int(i)
    else:
        return 'INTEGER' 

print(the_decimal(99.1))
print(the_decimal(99.0))
 

 <class 'float'>
0.09999999999999432
<class 'float'>
INTEGER
 

Для получения дополнительной информации о приведении типов чисел, которые вы просматриваете на этой странице

Комментарии:

1. Спасибо всем за вашу помощь. Мое недоразумение возникло из-за того, что я не знал, что вызов int возвращает целое число даже с плавающей точкой. Теперь я понимаю вычисления.