2015-01-22 4 views
0

Я использую десятичный модуль в python и вижу некоторое довольно странное поведение при преобразовании строк.Python String to Decimal Conversion - Weird results

print "orig = %s dec = %.19f" % (rate,Decimal(rate)) 

Результаты в:

orig = 0.0151 dec = 0.0151000000000000006 
orig = 0.00995 dec = 0.0099500000000000005 
orig = 0.011075 dec = 0.0110749999999999998 
orig = 0.dec = 0.
orig = 0.01 dec = 0.0100000000000000002 
orig = 0.047025 dec = 0.0470249999999999974 

Возможно еще относительно округление Десятичные, кажется, также производит странные результаты

print "orig = %.19f rep = %.19f" % (originalCashflow,replacementCashflow) 
originalCashflow = originalCashflow.quantize(Decimal('1.00'), rounding=ROUND_HALF_UP) 
replacementCashflow = replacementCashflow.quantize(Decimal('1.00'), rounding=ROUND_HALF_UP) 
print "orig = %.19f rep = %.19f" % (originalCashflow,replacementCashflow) 

Результаты в:

orig = -10028392.3750000000000000000 rep = -10028392.3750000000000000000 
orig = -10028392.3800000008195638657 rep = -10028392.3699999991804361343 

Это Безразлично» Кажется правильным. Что я делаю не так?

+1

Вы знаете, что число с плавающей точкой не является точным с самого начала, не так ли? https://stackoverflow.com/questions/2100490/floating-point-inaccuracy-examples – skyline75489

+0

и неточно вы имеете в виду? – debugoz

+1

Существует много статей о точности чисел с плавающей запятой, включая https://docs.python.org/2/tutorial/floatingpoint.html из документов python. Из-за того, что число с плавающей точкой хранится в памяти, реальное сохраненное значение числа с плавающей точкой является лишь приближением к исходной десятичной дроби и, следовательно, неточно. – skyline75489

ответ

0

Вы не конвертируете строки. Вы конвертируете поплавки.

orig = 0.0151 
orig_str = "0.0151" 

decimal.Decimal(orig) 

Выход:

Decimal('0.01510000000000000057454041524351850966922938823699951171875') 

Преобразование строк точно.

decimal.Decimal(orig_str) 

Выход:

Decimal('0.0151') 

Floats are not exact.