Уведомления

Группа в Telegram: @pythonsu

#1 Июль 4, 2022 12:36:38

7kozlov
Зарегистрирован: 2022-07-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

как бороться с 9999999999637

Приветствую.
Вопрос общего плана.
абсолютный чайник, прошел 3 урока.
Решал разные задачки, столкнулся с тем, что питон не всегда считает до нормальных целых знаков.
Вот должно получаться ровно 2.5 а у него получается 2.499999999999637 какие-нибудь.
Почему так? откуда он это берет? и как этого избегать без особо сложных конструкций?
Потому что иногда эти “блохи” не только чреваты ошибками в принципе, но и считаются ошибкой в некоторых задачах.
Можно, казалось бы заранее указывать кол-во знаков, но не всегда можно заранее угадать, с какого знака он начнет лепить эти 9999
Спасибо.

ЗЫ Не думаю, что необходимы примеры - не верю, что никто не сталкивался. Но если надо, пришлю, когда снова столкнусь.

Офлайн

#2 Июль 4, 2022 16:22:24

Areostar
Зарегистрирован: 2018-06-27
Сообщения: 162
Репутация: +  0  -
Профиль   Отправить e-mail  

как бороться с 9999999999637

round(14.22222223, 2)

>> 14.22

Офлайн

#3 Июль 4, 2022 18:01:00

7kozlov
Зарегистрирован: 2022-07-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

как бороться с 9999999999637

Areostar
round(14.22222223, 2)

спасибо. Но не всегда заранее понятно, что именно после второго знака начнется ерунда.
Хотелось бы универсальный способ. Хотя бы для результатов, которые вполне и АБСОЛЮТНО точно выражаются конечным числом в десятичной системе с вменяемо небольшим кол-вом знаков после запятой. Не обязательно 2,5 пусть 3,75 или 1,125

Отредактировано 7kozlov (Июль 4, 2022 18:05:30)

Офлайн

#4 Июль 4, 2022 18:13:33

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

как бороться с 9999999999637

7kozlov
Хотелось бы универсальный способ.
7kozlov
абсолютный чайник, прошел 3 урока.
продолжайте свои уроки, вам расскажут про типы



Офлайн

#5 Июль 4, 2022 19:37:53

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

как бороться с 9999999999637

7kozlov
Почему так? откуда он это берет?
Он это берет у процессора, который именно так и считает. Плавающая арифметика приближенная.
такой результат будет в любом языке программирования при использовании чисел в стандарте IEEE 754
https://en.wikipedia.org/wiki/Double-precision_floating-point_format#:~:text=In%20the%20IEEE%20754%2D2008,recently%2C%20base%2D10%20representations.


7kozlov
но и считаются ошибкой в некоторых задачах.
Авторы таких задач безграмотны, на них не надо обращать внимание.
7kozlov
и как этого избегать
Никак. При выводе вы можете округлить числа (например форматы f, g, e ). Но внутри расчет ведется именно с такими числами.



Офлайн

#6 Июль 5, 2022 15:56:33

7kozlov
Зарегистрирован: 2022-07-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

как бороться с 9999999999637

Большое спасибо за ответы. Кое-что понял.
Для меня, как чайника, стало открытием, что процессоры оперируют такими “кривыми” числами даже в тех случаях, когда есть “прямые” - то есть ровные и почти “целые”. Это значит заранее допускать дополнительные погрешности (и их возможное накопление) даже тогда, когда можно (казалось бы чайнику) обойтись без них. Вот очень мне это странно и математически противоестественно даже ))

Еще раз спасибо.

Отредактировано 7kozlov (Июль 5, 2022 15:57:25)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version