Azt akarom, hogy az "a"-t 13,95-ra kerekítsük.
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
A kerekítés
függvény nem úgy működik, ahogyan vártam.
A lebegőpontos számokkal kapcsolatban belefutsz abba a régi problémába, hogy nem minden számot lehet pontosan ábrázolni. A parancssor csak a teljes lebegőpontos formát mutatja a memóriából.
A lebegőpontos ábrázolással a kerekített változatod ugyanaz a szám. Mivel a számítógépek binárisak, a lebegőpontos számokat egész számként tárolják, majd elosztják egy kettes hatványával, így a 13,95 hasonló módon lesz ábrázolva, mint a 125650429603636838/(2**53).
A kettős pontosságú számok 53 bit (16 számjegy) pontosságúak, a normál lebegőpontos számok pedig 24 bit (8 számjegy) pontosságúak. A lebegőpontos típus a Pythonban kettős pontosságot használ az értékek tárolására.
Például,
>>> 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
Ha csak két tizedesjegyre van szüksége (például egy valutaérték megjelenítéséhez), akkor van néhány jobb választás:
Módosíthatja a kimeneti formátumot:
>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
Pontosan azt csinálja, amit mondtál neki, és helyesen működik. Olvasson többet a lebegőpontos zűrzavar és talán próbálkozzon inkább a decimális objektumokkal.