Я хочу, щоб "а" було округлено до 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
Якщо вам потрібні лише два знаки після коми (наприклад, для відображення вартості валюти), то у вас є кілька кращих варіантів:
Ви можете змінити формат виводу:
>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
Він робить саме те, що ви йому сказали, і працює коректно. Дізнайтеся більше про плутанину з плаваючою комою і, можливо, спробуйте замість цього використовувати десяткові об'єкти.