Использование десятичного числа в Python

Может кто-нибудь объяснить, что происходит ниже: (я использую Python 3.3)

1. >>> Decimal("0.1") + Decimal("0.1") + Decimal("0.1") - Decimal("0.3")
       Decimal('0.0')

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

3. >>> Decimal(0.1 + 0.1 + 0.1 - 0.3)
       Decimal('5.5511151231257827021181583404541015625E-17')

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

  • Какое отношение " " имеет к разнице между примерами 1 и 2 выше?
  • Почему 2 дает ответ, отличный от 3, если оба не имеют " "?

person yinka    schedule 28.01.2013    source источник


Ответы (1)


Короче говоря, ни 0.1, ни 0.3 не могут быть представлены в точности как float:

In [3]: '%.20f' % 0.1
Out[3]: '0.10000000000000000555'

In [4]: '%.20f' % 0.3
Out[4]: '0.29999999999999998890'

Следовательно, когда вы используете 0.1 или 0.3 для инициализации Decimal(), результирующее значение равно приблизительно 0.1 или 0.3.

Использование строк ("0.1" или "0.3") не имеет этой проблемы.

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

person NPE    schedule 28.01.2013