2011-06-26 11 views
6

Por alguna razón, el objeto decimal pierde precisión cuando se multiplica. No hay razón para suceder así. Por favor revisa el caso de prueba y me iluminas.python Precisión decimal

from decimal import * 
getcontext().prec = 11 

a = Decimal('5085.28725881485') 
b = 1 

print getcontext() 
print 'a  = '+str(a) 
print 'b  = '+str(b) 
print 'a * b = '+str(a * b) 

Y la salida:

Context(prec=11, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[], traps=[DivisionByZero, InvalidOperation, Overflow]) 
a  = 5085.28725881485 
b  = 1 
a * b = 5085.2872588 

No estoy seguro si esto es relevante, pero python2.6 utilizado.

+0

Establece la precisión en 11, y obtuvo 11 cifras significativas en su resultado. ¿Cuál es el problema? –

+0

¿no significa precisión los números después del punto? – marrat

+2

¿hay alguna manera de limitar la precisión al número después del punto? – marrat

Respuesta

11

La precisión se especifica en el contexto (11 lugares), sólo se aplica cuando se realizan cálculos , no al crear objetos decimal.Decimal - y el resultado, en efecto, 5085.2872588 creen a ese límite. Usar 1 ya que el multiplicador no cambia las reglas con respecto a la precisión; el resultado de las operaciones aritméticas siempre considera la precisión.

Si estuviera buscando decimal.Decimal para devolver un número redondeado a un número determinado de lugares, el método create_decimal del objeto de contexto lo hará por usted.