Найти - Пользователи
Полная версия: Проблемы с делением чисел. Арифметика
Начало » Python для новичков » Проблемы с делением чисел. Арифметика
1
Mumbai
Здравствуйте, уважаемые эксперты!
Столкнулся с такой проблемой. Обычные арифметические действия, но результат вычисления 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
Что за четвёрка в конце? Как решить эту проблему?
Спасибо всем, кто ответит…
FishHook
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.
Mumbai
Спасибо за ответ.
Проблему решил вот таким вот способом:
 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 предстоит разбираться.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB