2013-03-06 14 views
8

Sto scrivendo una classe per rappresentare il denaro, e un problema che ho incontrato è quello "1.50" != str(1.50). str (1.50) equivale a 1.5, e all'improvviso, POOF. 45 centesimi sono spariti e l'importo è ora 1 dollaro e 5 centesimi. non un dollaro e 50 centesimi. In qualsiasi modo potrei impedire a str di farlo, o sto facendo qualcosa di sbagliato? Questo è Python 2 BTW.Mantenere gli zero finali in python

+1

Questo illustra un punto importante: un dollaro e cinquanta i centesimi sono ** non ** equivalenti a, diciamo, 1,5 chili di peso. 1,5 sterline e 1,50 sterline sono esattamente la stessa cosa, e raramente ti importa della differenza tra 1,5 libbre e 1.50001 sterline. Questo perché "sterline" sta misurando una quantità * continua * (peso), mentre "centesimi" sta misurando una quantità * discreta *. –

+0

Un design di classe scadente colpisce ancora ... –

risposta

19

È possibile utilizzare il metodo format sulle stringhe per specificare quanti posti decimali si vuole rappresentare:

>>> "{:.2f}".format(1.5) 
'1.50' 

Ma ancora migliore sarebbe quella di utilizzare il decimal module per rappresentare il denaro, dal momento che la rappresentazione i problemi con i float binari possono darti risultati leggermente off se stai facendo aritmetica. La documentazione per quel modulo cita alcuni di questi problemi specificamente - uno di quelli più interessanti per le applicazioni Il denaro è:

>>> 0.1+0.1+0.1-0.3 
5.551115123125783e-17 
>>> from decimal import Decimal 
>>> Decimal('.1') + Decimal('.1') + Decimal('.1') - Decimal('.3') 
Decimal('0.0') 
+0

O semplicemente ""% .2f "% 1.5' – grc

1
x = 1.500000 

print '%.2f' % x 
print '{:.3f}'.format(x) 

risultato

1.50 
1.500 
Problemi correlati