Обмеження плаваючих значень до двох знаків після коми

Я хочу, щоб "а" було округлено до 13,95.

>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999

Функція round працює не так, як я очікував.

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

У випадку представлення з плаваючою комою, ваша округлена версія буде тим самим числом. Оскільки комп'ютери є двійковими, вони зберігають числа з плаваючою комою як ціле число, а потім ділять його на ступінь двійки, тому 13.95 буде представлено подібно до 125650429603636838/(2**53).

Числа подвійної точності мають 53 біти (16 цифр) точності, а звичайні числа з плаваючою комою мають 24 біти (8 цифр) точності. Для зберігання значень використовується тип з плаваючою комою в Python з подвійною точністю.

Наприклад,

  >>> 125650429603636838/(2**53)
  13.949999999999999

  >>> 234042163/(2**24)
  13.949999988079071

  >>> a=13.946
  >>> print(a)
  13.946
  >>> print("%.2f" % a)
  13.95
  >>> round(a,2)
  13.949999999999999
  >>> print("%.2f" % round(a,2))
  13.95
  >>> print("{0:.2f}".format(a))
  13.95
  >>> print("{0:.2f}".format(round(a,2)))
  13.95
  >>> print("{0:.15f}".format(round(a,2)))
  13.949999999999999

Якщо вам потрібні лише два знаки після коми (наприклад, для відображення вартості валюти), то у вас є кілька кращих варіантів:

  1. Використовувати цілі числа і зберігати значення в центах, а не в доларах, а потім ділити на 100 для конвертації в долари.
  2. Або використовувати число з фіксованою крапкою, наприклад десяткове.
Коментарі (13)

Ви можете змінити формат виводу:

>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
Коментарі (0)

Він робить саме те, що ви йому сказали, і працює коректно. Дізнайтеся більше про плутанину з плаваючою комою і, можливо, спробуйте замість цього використовувати десяткові об'єкти.

Коментарі (0)