Voglio che a
sia arrotondato a 13,95.
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
La funzione round
non funziona come mi aspettavo.
Ti stai imbattendo nel vecchio problema con i numeri in virgola mobile che non tutti i numeri possono essere rappresentati esattamente. La linea di comando ti sta solo mostrando la forma completa in virgola mobile dalla memoria.
Con la rappresentazione in virgola mobile, la tua versione arrotondata è lo stesso numero. Poiché i computer sono binari, memorizzano i numeri in virgola mobile come un intero e poi lo dividono per una potenza di due, quindi 13,95 sarà rappresentato in modo simile a 125650429603636838/(2**53).
I numeri a doppia precisione hanno 53 bit (16 cifre) di precisione e i float regolari hanno 24 bit (8 cifre) di precisione. Il tipo a virgola mobile in Python usa la doppia precisione per memorizzare i valori.
Per esempio,
>>> 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
Se volete solo due cifre decimali (per visualizzare un valore di valuta, per esempio), allora avete un paio di scelte migliori:
È possibile modificare il formato di uscita:
>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
Sta facendo esattamente quello che gli hai detto di fare e funziona correttamente. Leggi di più sulla confusione in virgola mobile e forse prova invece gli oggetti decimali.