печатать с плавающей точкой до n десятичных знаков, включая конечные 0 - PullRequest
31 голосов
/ 20 декабря 2011

Мне нужно напечатать или преобразовать число с плавающей запятой в 15-значную десятичную строку, даже если результат имеет много конечных 0, например:

1.6 становится 1.6000000000000000

Я пробовал округлить (6.2,15), но он возвращает 6.2000000000000002, добавив ошибку округления

Я также видел в сети разных людей, которые помещали число с плавающей точкой в ​​строку, а затем добавляли конечные нули вручную, но это кажется плохим ...

Каков наилучший способ сделать это?

Ответы [ 3 ]

60 голосов
/ 20 декабря 2011

Для версий Python в 2.6+ и 3.x

Вы можете использовать метод str.format. Примеры:

>>> print('{0:.16f}'.format(1.6))
1.6000000000000001

>>> print('{0:.15f}'.format(1.6))
1.600000000000000

Обратите внимание, что 1 в конце первого примера является ошибкой округления; это происходит потому, что точное представление десятичного числа 1.6 требует двоичного числа с бесконечным числом. Поскольку числа с плавающей запятой имеют конечное число битов, число округляется до ближайшего, но не равного значения.

Для версий Python до 2.6 (по крайней мере, до 2.0)

Вы можете использовать синтаксис "по модулю форматирования" (это работает и для Python 2.6 и 2.7):

>>> print '%.16f' % 1.6
1.6000000000000001

>>> print '%.15f' % 1.6
1.600000000000000
5 голосов
/ 20 декабря 2011

Числа с плавающей запятой не имеют точности, чтобы точно представить «1.6» во многих десятичных разрядах.Ошибки округления реальны.Ваш номер на самом деле не 1.6.

Выезд: http://docs.python.org/library/decimal.html

4 голосов
/ 20 декабря 2011

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

import decimal

def display(x):
    digits = 15
    temp = str(decimal.Decimal(str(x) + '0' * digits))
    return temp[:temp.find('.') + digits + 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...