Проще проверить это, когда вы отделите функцию:
def m(x, y):
first = x + y
second = abs(x - y)
third = first + second
fourth = third / 2
print("x+y\t\t\t", first)
print("abs(x-y)\t\t", second)
print("x+y + abs(x-y)\t\t", third)
print("(x+y + abs(x-y))/2\t", fourth)
m(-894, 2.3)
Вы получите следующие выходные данные:
x+y -891.7
abs(x-y) 896.3
x+y + abs(x-y) 4.599999999999909
(x+y + abs(x-y))/2 2.2999999999999545
Теперь, глядя на x+y + abs(x-y)
, мы имеем следующее:
var = -891.7 + 896.3
print(var)
Какие выходные данные:
4.599999999999909
Это, конечно, должно быть 4.6
, но о происходящем можно сослаться из документации Python здесь :
Обратите внимание, что это по своей природе двоичная с плавающей запятой: это не ошибка в Python и не ошибка в вашем коде. Вы увидите то же самое на всех языках, которые поддерживают арифметику с плавающей запятой вашего оборудования (хотя некоторые языки могут не отображать разницу по умолчанию или во всех режимах вывода).
Вы можетеРешите эту проблему, используя библиотеку decimal
, поставляемую с Python:
from decimal import *
getcontext().prec = 10
var = Decimal(-891.7) + Decimal(896.3)
print(var)
output:
4.600000000
В этом случае ваша точность может быть настолько большойкак 13 для правильного вывода вариации 4.6
. Увеличьте его до 14 или больше, и вы заметите, что снова получите свой 4.59....
.