Chcem, aby sa a
zaokrúhlilo na 13,95.
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
Funkcia zaokrúhliť
nefunguje tak, ako som očakával.
Pri číslach s pohyblivou rádovou čiarkou narážate na starý problém, že nie všetky čísla sa dajú reprezentovať presne. Príkazový riadok vám práve zobrazuje úplný tvar čísla s pohyblivou rádovou čiarkou z pamäte.
Pri reprezentácii s pohyblivou rádovou čiarkou je vaša zaokrúhlená verzia rovnaké číslo. Keďže počítače sú binárne, ukladajú čísla s pohyblivou rádovou čiarkou ako celé číslo a potom ho vydelia mocninou dvoch, takže 13,95 bude reprezentované podobne ako 125650429603636838/(2**53).
Čísla s dvojitou presnosťou majú 53 bitov (16 číslic) presnosti a bežné čísla s pohyblivou rádovou čiarkou majú 24 bitov (8 číslic) presnosti. Na ukladanie hodnôt sa v jazyku Python používa typ s pohyblivou rádovou čiarkou s dvojitou presnosťou.
Napríklad,
>>> 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
Ak vám ide len o dve desatinné miesta (napríklad na zobrazenie hodnoty meny), máte niekoľko lepších možností:
Výstupný formát môžete upraviť:
>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
Robí presne to, čo ste mu povedali, a funguje správne. Prečítajte si viac o floating point confusion a možno namiesto toho skúste objekty decimal.