#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:
Происходят две вещи:
- 99.1 неявно преобразуется в число с плавающей запятой, которое по своей конструкции является неточным, что приводит к повторному десятичному выводу (в Python3.8 я получаю 0.099999999999999432
- Вычитание происходит между десятичным и целочисленным представлением этого десятичного числа (по существу, округление до целого числа), которое, конечно, не будет равно нулю.
Итак, хотя число 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 возвращает целое число даже с плавающей точкой. Теперь я понимаю вычисления.