2012-09-12 23 views
5

Opinión # 18, en 20 controversial programming opinionsredondeo decimal de Python

me hizo pensar. Así que probé imprimiendo el valor de pi a 5 decimales.

Estaba bien ya que pensé que definitivamente podría hacerlo en Python rápidamente. Unos segundos en Google llegué a conocer el Decimal module of Python. Y yo estaba hecho. El descanso era una lógica básica que cualquier persona puede inventar para resumir la serie y obtener el valor de Pi.

>>>from decimal import * 
>>>getcontext().prec = 6 
>>>Decimal(22)/Decimal(7) 

escribí el guión rápido anterior solo para comprobar lo que voy a obtener.

Pero aquí está la cosa, getcontext().prec = 6 me dio un valor redondeado!

>>>3.14286 

para ser exactos.

Quiero saber cómo puedo asegurarme de que el enésimo lugar después del decimal no se haya redondeado? Quiero decir que aquí hubiera querido que la respuesta fuera 3.14285

+0

nada se redondea en decimal ... es apenas la impresión ... que puede hacer ' "{0: 0,6F}". formato (Decimal (22)/Decimal (7)) 'al menos hasta donde yo entiendo sin probar ... –

+0

http://en.wikipedia.org/wiki/Proof_that_22/7_exceeds_%CF%80 –

+3

@JoranBeasley: usted están absolutamente equivocados. Decimal * does * round (o truncado, dependiendo del comportamiento que especifique en el contexto). Para eso es el valor de precisión. Pruebe el formato ''{: .50f}'. (Decimal (22)/Decimal (7))' y vea todos esos ceros al final. –

Respuesta

9

Al igual que especifica la precisión mediante el contexto Decimal, también puede especificar las reglas de redondeo.

from decimal import * 

getcontext().prec = 6 
getcontext().rounding = ROUND_FLOOR 

print Decimal(22)/Decimal(7) 

el resultado será

3.14285 

http://docs.python.org/release/3.1.5/library/decimal.html#decimal.Context

+0

¡Muchas gracias! Nunca me ocurrió buscar 'piso' jaja! –

+3

Si solo desea cambiar el contexto de esta parte del código, a 'con localcontext() como ctx: ctx.prec = 6; ctx.rounding = ROUND_FLOOR; imprimir Decimal (22)/Decimal (7) 'podría ser útil. – glglgl