2012-09-12 17 views
5

Parere n. 18, in 20 controversial programming opinionsarrotondamento decimale Python

mi ha fatto pensare. Così ho provato a stampare il valore di pi in 5 cifre decimali.

Era ok perché pensavo di poterlo fare in Python velocemente. Qualche secondo su Google ho avuto modo di conoscere lo Decimal module of Python. E ho finito. Il riposo era una logica di base che chiunque può inventare per riassumere la serie per ottenere il valore di Pi.

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

ho scritto lo script rapido sopra solo per verificare cosa otterrò.

Ma ecco la cosa, getcontext().prec = 6 mi ha dato un valore arrotondato!

>>>3.14286 

per essere precisi.

Voglio sapere come posso essere sicuro che l'ennesimo posto dopo il decimale non sia arrotondato? Intendo dire che avrei voluto che la risposta fosse 3.14285

+0

nulla è arrotondato in decimale ... il suo solo la stampa ... si può fare ' "{0: 0.6f}". format (Decimal (22)/Decimal (7)) 'almeno per quanto ho capito senza testare ... –

+0

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

+3

@JoranBeasley: tu sono assolutamente sbagliati. Decimale * fa * round (o troncato, a seconda del comportamento specificato nel contesto). Ecco a cosa serve il valore di precisione. Prova ''{:. 50f}'. Format (Decimal (22)/Decimal (7))' e vedi tutti quegli zeri alla fine. –

risposta

9

Proprio come si specifica la precisione utilizzando il contesto Decimale, è possibile specificare anche le regole di arrotondamento.

from decimal import * 

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

print Decimal(22)/Decimal(7) 

il risultato sarà

3.14285 

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

+0

Grazie mille! Non mi è mai capitato di cercare "piano" haha! –

+3

Se si desidera modificare solo il contesto per questa parte di codice, a 'con localcontext() come ctx: ctx.prec = 6; ctx.rounding = ROUND_FLOOR; stampare Decimale (22)/Decimale (7) 'potrebbe essere utile. – glglgl