Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 3, 2019 06:04:34

Mumbai
Зарегистрирован: 2019-04-03
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с делением чисел. Арифметика

Здравствуйте, уважаемые эксперты!
Столкнулся с такой проблемой. Обычные арифметические действия, но результат вычисления python-программы необычный и неправильный.
Вот сам скрипт, который делает вычисление:
print(((7-6.35)/6.5+9.9)/((1.2/36+1.2/0.25-(16*1+5)/16)/(169/24)))
Ответ должен быть 20.00, но выдаёт 20.000000000000004
Что за четвёрка в конце? Как решить эту проблему?
Спасибо всем, кто ответит…

Прикреплённый файлы:
attachment forforum.png (103,8 KБ)

Офлайн

#2 Апрель 3, 2019 06:53:37

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

Проблемы с делением чисел. Арифметика

Mumbai
Ответ должен быть 20.00, но выдаёт 20.000000000000004
Что за четвёрка в конце? Как решить эту проблему?

Хочу вас разочаровать, подобные нюансы ждут вас в компьютерном мире на каждом шагу. И питон тут не при чем. Вот как по-вашему, компьютер должен хнанить в памяти 6.35?
Давайте представим, что у нас троичная система исчисления, то есть числа от одного до десяти мы будем записывать вот так:
0 -> 0
1 -> 1
2 -> 2
3 -> 10
4 -> 11
5 -> 12
6 -> 20
7 -> 21
8 -> 22
9 -> 30
10 -> 31

и тогда в этой системе исчисления дробь 1/3 будет записана вот так: 0.1
а в нашей привычной десятичной системе 1/3 - это бесконечная дробь 0.3333333333333…

Вернемся к вопросу, как хранить в двоичной системе компьютера числа, которые в десятичной системе записываются компактно, а в двоичной нет? Мы же ведь не можем выделить бесконечную память для хранения наших переменных, память ограничена, поэтому точность вычислений с делением всегда не абсолютная, она ограничена применяемым алготитмом. По этому поводу стоит почитать вот это
https://ru.wikipedia.org/wiki/IEEE_754-2008
это сложно, но совершенно необходимо для программирования.

В вашем случае есть несколько решений:
1) во-первых, нормальная практика, когда числа с плавающей запятой сравниваются с заранее заданной точностью. То есть не так
20.00 == 20.000000000000004
а так
a = 20.0
b = 20.000000000000004
e = 0.0000001
abs(a - b) <= e
2) во-вторых, для финансовых расчетов, где важны всякие милликопейки используется
https://ru.wikipedia.org/wiki/Двоично-десятичный_код
в питоне для этого есть специальный тип Decimal.



Офлайн

#3 Апрель 3, 2019 09:25:44

Mumbai
Зарегистрирован: 2019-04-03
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с делением чисел. Арифметика

Спасибо за ответ.
Проблему решил вот таким вот способом:

 import math
x=(((7-6.35)/6.5+9.9)/((1.2/36+1.2/0.25-(16*1+5)/16)/(169/24)))
x=(round(x, 3))
print(x)
С Decimal предстоит разбираться.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version