Python

Почему при вычитание в python остаётся 0.00000000000000018

Почему при 5.5 - 5.3 получается 0.20000000000000018
откуда берётся 18?
Дима Иванв
Дима Иванв
1 435
Вопрос, скорее, в способе представления.

Вот простой пример: если работать с простыми дробями, то мы легко получим 1/3 + 1/3 + 1/3 = 1.
А на десятичном калькуляторе это будет 0.333333 + 0.333333 + 0.333333 = 0.999999
И даже если увеличить точность в 10 раз, ошибка станет меньше, но останется, потому что 1/3 в десятичных дробях точно не представляется в принципе, никаким числом знаков.

Так же и с представлением 0.1 (то есть 1/10) в виде двоичной дроби (как это всё хранится для float)

Замечу, что целые числа без дробей, а также дроби вида 0.5, 0.25 представляются в формате float точно (до каких-то пределов, конечно) и таких явных ошибок не дают
AF
Adil Ffcc
83 299
Лучший ответ
К сожалению, тут нужно применять операцию округления. У Питона точность вычисления высокая, но конечная
Юра Айкашев
Юра Айкашев
83 853
Это не от вычитания и не от питона зависит.

Просто потому, что на компьютере числа хранятся в двоичном виде и точно могут быть представлены дроби только для степени двойки в знаменателе (под чертой дроби).

То есть 0.125 = 1/8 хранится точно, так как 8 степень двойки.
А 0.1 = 1/10 не точно, так как 10 не является степенью двойки
Вот например посмотрите на это:
==================
>>> f'{0.1:.65f}'
'0.10000000000000000555111512312578270211815834045410156250000000000'
>>> from fractions import Fraction
>>> Fraction(0.1)
Fraction(3602879701896397, 36028797018963968)
>>>

В Вашем примере 5.5 хранится точно, так как 5.5 = 11/2
А 5.3 нет
>>> f'{5.5:.65f}'
'5.50000000000000000000000000000000000000000000000000000000000000000'
>>> f'{5.3:.65f}'
'5.29999999999999982236431605997495353221893310546875000000000000000'
>>>
Nikoлай Рыбинцев
Nikoлай Рыбинцев
21 729
Ошибка операции с плавающей точкой
Гуглим "IEEE-тика угрожает человечеству"