2010-07-11 28 views
9

Al aceptar la entrada del usuario con un decimal en Python que estoy usando:especificando el número de decimales en Python

#will input meal subtotal 
def input_meal(): 
    mealPrice = input('Enter the meal subtotal: $') 
    mealPrice = float (mealPrice) 
    return mealPrice 

que devuelve exactamente lo que se entró - decir $ 43.45
pero cuando se utiliza ese valor para calcular y impuesto sobre la pantalla que estoy usando:

#will calculate 6% tax 
def calc_tax(mealPrice): 
    tax = mealPrice*.06 
    return tax 

que devuelve una pantalla de $ 2,607 utilizando

mealPrice = input_meal() 
tax = calc_tax(mealPrice) 
display_data(mealPrice, tax) 

¿Cómo puedo configurar eso en $ 2,61 en su lugar?
Perdóneme, me doy cuenta de que esto es básico pero no lo llaman Intro por nada ...

¡Gracias!

+0

Janet, FYI, necesita una línea en blanco antes de las secciones de códigos. O simplemente resaltarlos y hacer clic en el botón '1010'. (Esta vez le arreglé la sangría) – Stephen

Respuesta

2

Usted no se presenta el código de display_data, pero aquí es lo que hay que hacer:

print "$%0.02f" %amount 

Esta es una format specifier para la variable amount.

Dado que este es el tema para principiantes, no entraré en floating point rounding error, pero es bueno saber que existe.

+0

¡La mejor respuesta aquí, gracias! –

21

Hay varias maneras de hacerlo dependiendo de cómo quiera mantener el valor.

Puede utilizar el formato básico de cadena, por ejemplo

'Your Meal Price is %.2f' % mealPrice 

Puede modificar el 2 a cualquier precisión que necesita.

Sin embargo, dado que se trata de dinero, debe buscar en el módulo decimal que tiene un método genial llamado quantize que es exactamente para trabajar con aplicaciones monetarias. Se puede utilizar de este modo:

from decimal import Decimal, ROUND_DOWN 
mealPrice = Decimal(str(mealPrice)).quantize(Decimal('.01'), rounding=ROUND_DOWN) 

Tenga en cuenta que el atributo es puramente opcional también.

+1

''% .2f '% mealPrice' funcionó muy bien! (Sin embargo, tendré que buscar más en el módulo decimal - no pude hacer que funcione) ¡Muchas gracias! – Janet

+1

+1 para la referencia decimal; con flotadores, obtendrá algunos redondeos sorprendentes (por ejemplo, pruebe un precio de comida de '0.25'). Pero no creo que su línea decimal funcione: intente 'quantize (Decimal ('0.01'))' en lugar de 'quantize ('. 01')'. –

+0

@Mark ¡Gracias! tienes razón, no es así.Lo arreglé, además tenía un error de sintaxis ... debería haber probado mi código :) – Bartek

2

Para calcular el impuesto, se puede usar round (después de todo, eso es lo que hace el restaurante):

def calc_tax(mealPrice): 
    tax = round(mealPrice*.06,2) 
    return tax 

para mostrar los datos, se puede utilizar una cadena de múltiples líneas, y la string format method:

def display_data(mealPrice, tax): 
    total=round(mealPrice+tax,2) 
    print('''\ 
Your Meal Price is {m:=5.2f} 
Tax    {x:=5.2f} 
Total    {t:=5.2f} 
'''.format(m=mealPrice,x=tax,t=total)) 

Tenga en cuenta que el método de formato se introdujo en Python 2.6, para las versiones anteriores se tendrá que utilizar a la antigua cadena de interpolación %:

print('''\ 
Your Meal Price is %5.2f 
Tax    %5.2f 
Total    %5.2f 
'''%(mealPrice,tax,total)) 

Entonces

mealPrice=input_meal() 
tax=calc_tax(mealPrice) 
display_data(mealPrice,tax) 

rendimientos:

# Enter the meal subtotal: $43.45 
# Your Meal Price is 43.45 
# Tax     2.61 
# Total    46.06 
+0

También funciona a la perfección. ¿Eso difiere significativamente de 'Su precio de comida es% .2f'% mealPrice '? – Janet

+0

'% 5.2f' funcionaría de la misma manera (ver arriba). Empecé a usar 'format' como preparación para el puerto a Python 3. Pero en este caso, no he hecho nada con' format' que no se pueda hacer con la interpolación de cadenas. – unutbu

7

Estoy sorprendido por el segundo número usted menciona (y confirma por el redondeo solicitado) - al principio pensé que mi instinto para la aritmética mental comenzaba a fallarme (I am envejecer, después de todo, ¡así que podría estar yendo del mismo modo que mi memoria antes nítida! -) ... pero luego confirmé que todavía no lo había hecho, usando, como imagino que eres, Python 3.1, y copiar y pegar ..:

>>> def input_meal(): 
...  mealPrice = input('Enter the meal subtotal: $') 
...  mealPrice = float (mealPrice) 
...  return mealPrice 
... 
>>> def calc_tax(mealPrice): 
...  tax = mealPrice*.06 
...  return tax 
... 
>>> m = input_meal() 
Enter the meal subtotal: $34.45 
>>> print(calc_tax(m)) 
2.067 
>>> 

... como era de esperar - sin embargo, se dice que en lugar de "devuelve una pantalla de $ 2.607" ... lo que podría ser un error tipográfico, simplemente intercambiando dos dígitos, excepto que luego pregunte "¿Cómo puedo establecer eso en $ 2,61 en su lugar?" así que realmente parece que realmente quiere decir 2.607 (que podría redondearse a 2.61 de varias maneras) y definitivamente no es el resultado aritméticamente correcto, 2.067 (que en el mejor de los casos podría redondearse a 2.07 ... definitivamente no a 2.61 según solicite) .

Imagino que primero tuvo el error de tipeo en la transcripción, y luego calculó mentalmente el redondeo deseado de la falsa por tilde 2.607 en lugar del resultado original real - ¿es eso lo que sucedió? ! Seguro que logró confundirme por un tiempo -)

De todos modos, para redondear un flotador a dos dígitos decimales, el enfoque más simple es la función incorporada round con un segundo argumento de 2:

>>> round(2.067, 2) 
2.07 
>>> round(2.607, 2) 
2.61 

para los números exactamente equidistantes entre dos posibilidades, se redondea a incluso:

>>> round(2.605, 2) 
2.6 
>>> round(2.615, 2) 
2.62 

o, como los documentos ponen (ejemplificando con la forma de un solo argumento de round, que se redondea a la más cercana en Teger):

si dos múltiplos son igual de cerca, el redondeo se realiza hacia el incluso elección (así, por ejemplo, tanto redondo (0.5) y redondo (-0,5) son 0, y redondo (1,5) es 2).

Sin embargo, para los cálculos sobre el dinero, Secundo la recomendación, ya dada en otras respuestas, a seguir con lo que las ofertas decimal módulo, en lugar de float números.

+0

Solo un detalle: gracias a los problemas binarios de punto flotante habituales, '2.605' y' 2.615' no son exactamente equidistantes entre dos posibilidades; por lo que es realmente solo por pura casualidad que sus ejemplos redondos luzcan como si estuvieran dando un resultado 'de la mitad a la par'. 'round (2.635, 2)' da '2.63', por ejemplo. IOW, I * tercera * sugerencia de probar el módulo decimal si es importante obtener la dirección de redondeo correcta para la mitad de los casos. :) Por cierto, en Python 2.x, 'round' todavía se redondea a medio camino de distancia de cero, en lugar de igualar. –

Cuestiones relacionadas