Chcę, aby a
było zaokrąglone do 13.95.
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
Funkcja round
nie działa tak, jak się spodziewałem.
Wpadasz na stary problem z liczbami zmiennoprzecinkowymi, że nie wszystkie liczby mogą być reprezentowane dokładnie. Wiersz poleceń właśnie pokazuje ci pełną formę zmiennoprzecinkową z pamięci.
Z reprezentacją zmiennoprzecinkową, twoja zaokrąglona wersja jest tą samą liczbą. Ponieważ komputery są binarne, przechowują liczby zmiennoprzecinkowe jako liczbę całkowitą, a następnie dzielą ją przez potęgę dwójki, więc 13,95 będzie reprezentowane w podobny sposób jak 125650429603636838/(2**53).
Liczby podwójnej precyzji mają 53 bity (16 cyfr) precyzji, a zwykłe liczby zmiennoprzecinkowe mają 24 bity (8 cyfr) precyzji. Typ zmiennoprzecinkowy w Pythonie używa podwójnej precyzji](http://docs.python.org/tutorial/floatingpoint.html) do przechowywania wartości.
Na przykład,
>>> 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
Jeśli chcesz mieć tylko dwa miejsca po przecinku (na przykład, aby wyświetlić wartość walutową), masz kilka lepszych wyborów:
Można zmodyfikować format wyjściowy:
>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
To robi dokładnie to, co kazałeś mu zrobić i działa poprawnie. Przeczytaj więcej o floating point confusion i może spróbuj decimal obiekty zamiast.