2013-03-06 8 views
8

Я пишу класс для представления денег, и одна проблема, с которой я столкнулся, заключается в том, что "1.50" != str(1.50). str (1.50) равно 1.5, и внезапно POOF. 45 центов исчезли, и сумма теперь составляет 1 доллар и 5 центов. не один доллар и 50 центов. В любом случае я мог бы помешать str сделать это, или я делаю что-то неправильно? Это Python 2 BTW.Сохранять конечные нули в python

+1

Это иллюстрирует важный момент: один доллар и пятьдесят цента ** не ** эквивалентна, скажем, 1,5 фунтам веса. 1,5 фунта и 1,50 фунта - это то же самое, и вы редко заботитесь о разнице между 1,5 фунтами и 1,50001 фунта. Это связано с тем, что «фунты» измеряют * непрерывное количество (вес), а «цента» измеряет * дискретное * количество. –

+0

Плохой класс снова наносит удар ... – 2015-11-09 03:38:13

ответ

19

Вы можете использовать format метод на строках, чтобы указать, сколько знаков после запятой вы хотите, чтобы представить:

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

Но еще лучше было бы использовать decimal module для представления денег, так как представления проблемы с бинарными поплавками могут дать вам несколько результатов, если вы делаете арифметику. В документации для этого модуля упоминает некоторые из этих вопросов, а именно - один из самых интересных для денежных приложений:

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

Или просто ''% .2f "% 1.5' – grc

1
x = 1.500000 

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

результата

1.50 
1.500