Как избежать неточностей при подсчете различных выражений в Python? Суть проблемы заключается в том, что при подсчете разных чисел с плавающей точкой есть много неприятных и тонких моментов.
Ну например, есть довольно тривиальная задачка на вероятности: В магазине стоят два платёжных терминала. Каждый из них может быть неисправен
с вероятностью 0,3 независимо от другого терминала. Найдите вероятность того, что
хотя бы один платежный терминал исправен.
Правильным ответом здесь является 0.91, т.е P = (0.3 * 0.7) + (0.7 * 0.3) + (0.7 * 0.7)
Но интерпритатор питона выдает не очень корректный результат (0.9099999999999999).
Я знаю, что это происходит из-за специфичной реализации хранения вещественных чисел в памяти.
Но мой вопрос заключается в том, как именно можно обходить подобные проблемы при работе с такими числами в Python?

21 Авг 2019 в 06:09
171 +1
0
Ответы
1

Для избежания неточностей при подсчете выражений с числами с плавающей точкой в Python можно использовать модуль decimal. Модуль decimal предоставляет возможность работать с числами с фиксированной точностью, что избавляет от проблем с точностью вычислений.

Вот пример, как можно переписать вашу задачу с использованием модуля decimal:

from decimal import Decimal
p_terminal_broken = Decimal('0.3')
p_terminal_working = Decimal('0.7')
P = (p_terminal_broken * p_terminal_working) + (p_terminal_working * p_terminal_broken) + (p_terminal_working * p_terminal_working)
print(P)

Таким образом, вы получите точный результат без неточностей.

20 Апр в 13:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир