Noriu, kad a
būtų suapvalinta iki 13,95.
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
Funkcija apvalinti
neveikia taip, kaip tikėjausi.
Susiduriate su sena problema, susijusia su slankiojo kablelio skaičiais, kad ne visus skaičius galima tiksliai atvaizduoti. Komandinėje eilutėje tik parodoma pilna slankiojo kablelio forma iš atminties.
Naudojant slankiojo kablelio atvaizdavimą, jūsų suapvalinta versija yra tas pats skaičius. Kadangi kompiuteriai yra dvejetainiai, jie saugo slankiojo kablelio skaičius kaip sveikąjį skaičių ir tada dalina jį iš dviejų galingumų, todėl 13,95 bus pavaizduotas panašiai kaip 125650429603636838/(2**53).
Dvigubo tikslumo skaičiai turi 53 bitų (16 skaitmenų) tikslumą, o įprasti slankiojo kablelio skaičiai - 24 bitų (8 skaitmenų) tikslumą. Vertėms saugoti slankiojo kablelio tipas Python naudoja dvigubo tikslumo.
Pavyzdžiui,
>>> 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
Jei jums reikia tik dviejų skaičių po kablelio (pavyzdžiui, norint parodyti valiutos vertę), turite keletą geresnių pasirinkimų:
Galite keisti išvesties formatą:
>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
Jis daro būtent tai, ką liepėte, ir veikia teisingai. Skaitykite daugiau apie slankiojo kablelio painiavą ir galbūt vietoj to pabandykite dešimtainį objektą.