почему в сумме десятичных дробей все еще есть ошибки с плавающей точкой? - PullRequest
1 голос
/ 24 февраля 2020

Я использую модуль десятичных дробей, чтобы попытаться избежать ошибок с плавающей запятой. В документальном фильме о десятичном модуле говорится:

Десятичные числа могут быть представлены точно. Напротив, числа типа 1.1 и 2.2 не имеют точных представлений в двоичной с плавающей запятой. Конечные пользователи обычно не ожидают, что 1.1 + 2.2 будет отображаться как 3.3000000000000003, как это происходит с двоичной плавающей запятой.

Но когда я пытаюсь суммировать с десятичными числами, я все равно получаю эти ошибки с плавающей запятой.

decimal.Decimal(4.04)+decimal.Decimal(4.04)
>>Decimal('8.080000000000000071054273576')

Почему это?

1 Ответ

2 голосов
/ 24 февраля 2020

Попробуйте поместить строки вокруг литералов с плавающей запятой, например, так:

decimal.Decimal('4.04')+decimal.Decimal('4.04')

В указанном коде необработанный двоичный тип (база 2) "float" передается в Decimal. Когда вы используете строки для представления числа 4.04, например, Decimal представляет '4.04' точно в базе 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...