Почему точность точна, когда Decimal () принимает строку вместо float?в Python - PullRequest
2 голосов
/ 19 апреля 2019

Почему эти значения отличаются и чем они отличаются друг от друга?

>>> from decimal import Decimal
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')
Decimal('0.0')

>>> Decimal(0.1) + Decimal(0.1) + Decimal(0.1) - Decimal(0.3)
Decimal('2.775557561565156540423631668E-17')

Ответы [ 2 ]

3 голосов
/ 19 апреля 2019

Это цитата из исходного кода модуля Decimal, который довольно хорошо объясняет, что если входные данные являются float, модуль внутренне вызывает метод класса "Decimal.from_float ()":

Обратите внимание, что Decimal.from_float (0.1) отличается от десятичного ('0.1').Поскольку 0.1 не является точно представимым в двоичной плавающей запятой, значение сохраняется как ближайшее представимое значение, которое равно 0x1.999999999999ap-4.Точный эквивалент значения в десятичном виде: 0,1000000000000000055511151231257827021181583404541015625.

0 голосов
/ 19 апреля 2019

Когда вы передаете '0.1' как строку, десятичное число преобразуется в число с плавающей точкой, без потери точности, но теряет точность, когда вы передаете число с плавающей точкой непосредственно как 0.1, как вы можете видеть ниже

>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> Decimal('0.1')
Decimal('0.1')

Это приводит к всевозможным странным результатам

>>> Decimal(0.3) - Decimal(0.1) + Decimal(0.1) + Decimal(0.1)
Decimal('0.3999999999999999944488848768')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...