Kintamųjų skaičių apribojimas iki dviejų skaičių po kablelio

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ų:

  1. Naudokite sveikuosius skaičius ir saugokite vertes centais, o ne doleriais, o tada padalykite iš 100 ir konvertuokite į dolerius.
  2. Arba naudokite fiksuoto kablelio skaičių, pavyzdžiui, dešimtainė.
Komentarai (13)

Galite keisti išvesties formatą:

>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
Komentarai (0)

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ą.

Komentarai (0)