Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Почему нельзя получить точное число?

#python #float


Объясните, из-за чего происходит вот такая штука:

>>> 1 - 0.7
0.30000000000000004


и как с этим бороться? 
    


Ответы

Ответ 1



Такова природа чисел с плавающей запятой: они описываются через экспоненту, и их "шаг" может выглядеть довольно странно, однако обычно он достаточно мал, чтобы избежать серьезных ошибок. В документации, насколько понял, рекомендуют использовать round().

Ответ 2



Дело в том, что в памяти числа хранятся в двоичном виде, а 0.3 в двоичном виде выглядит как бесконечная периодическая дробь (0.0100110011001...). В память бесконечное число цифр, понятное дело, не запишешь, поэтому реально там хранится число чуть меньше, чем 0.3. При вычитании этого числа из 1 и выводе на экран эта небольшая разница и выплывает наружу. Что с этим делать - смириться с несовершенством мира и при выводе округлять до приемлемого числа знаков. Подробнее о представлении чисел с плавающей запятой тонкостях операций с ними: статья на Хабре

Ответ 3



Ещё можно попытаться привести числа с плавающей запятой к целым числам. Например, следующее неравенство: 1 - 0.7 > 0.3 (на которое python мне ответил True) можно заменить на эквивалентное домножив обе части на 10: 10 - 7 > 3 Тут я уже, как и ожидалось, получил False.

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

Отправить комментарий