Ограничаване на плаващите числа до две десетични точки

Искам a да се закръгли на 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. Или използвайте число с фиксирана запетая, например decimal.
Коментари (13)

Можете да промените изходния формат:

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

Той прави точно това, което сте му казали да прави, и работи правилно. Прочетете повече за floating point confusion и може би опитайте вместо това с decimal обекти.

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