2010-07-19 16 views
6

Leí el precio de la entrada del usuario. Cuando i multiplicar la entrada con int como esteBash Multiplicando decimal a int

T= "$((PRICE*QTY))"|bc ; gives line 272: 12.00: syntax error: invalid arithmetic operator (error token is ".00") or .50

dependiendo de la entrada del usuario. ¿Cómo multiplico estas dos variables y obtengo un total de 2 puntos decimales?

+0

¡WOW! ¡Esto es bueno! Nunca he visto respuestas tan rápidas en otros foros, sin importar cuán activos sean y, sobre todo, recibo respuestas de "no haremos tu tarea para ti". Esto funcionó para mí T = 'echo $ QTYS \ * $ PRICE | bc'; También es el precio de redondeo a 2 decimales sin escala. Por alguna razón solo precio * QTY me estaba dando error de comando no encontrado. – svenus

+0

Una cosa para recordar es que bash realmente no tiene ningún tipo de datos excepto cadenas. Cada variable se reduce a una cadena, por lo que puede ayudarte a recordar eso. Diferentes programas, por supuesto, tratarán ciertas cadenas de una manera especial. – Daenyth

Respuesta

2
T="$(echo "$PRICE*$QTY" | bc)" 
+0

obtengo (standard_in) 2: error de sintaxis idk why. es casi lo mismo que el anterior – svenus

+0

@svenus: Este funciona para mí. No sé por qué estás recibiendo ese error de 'bc'. –

4
var=$(echo "scale=2;$PRICE*$QTY" |bc) 

También puede usar awk

awk -vp=$PRICE -vq=$QTY 'BEGIN{printf "%.2f" ,p * q}' 
+0

./menu3.sh: línea 278: 12.25: error de sintaxis: operador aritmético no válido (el token de error es ".25") – svenus

+0

elimina el '$ (())'. bash no hace aritmética flotante. Si desea establecer 2 decimales, use scale = 2 – ghostdog74

+0

. Necesita signos de dólar antes de cada nombre de variable. –

13

esto funciona:


PRICE=1.1 
QTY=21 
RES=$(echo "scale=4; $PRICE*$QTY" | bc) 
echo $RES 
+0

ha !! ¡Eso también funciona totalmente! Me perdí el eco. ¡Gracias! – svenus

0

En primer lugar, tratar de hacer aritmética de punto flotante con bc(1) sin necesidad de utilizar la bandera -l está obligado para darle algunas respuestas divertidas:

[email protected]:~$ bc -q 
3.5 * 3.5 
12.2 
[email protected]:~$ bc -q -l 
3.5 * 3.5 
12.25 

En segundo lugar, el $((...)) es un intento de hacer aritmética en su caparazón; ni mi bash ni dash pueden manejar números en coma flotante.

Si desea hacer la aritmética en su caparazón, tenga en cuenta printf(1), así como (probablemente) la función incorporada printf de su caparazón. Si desea hacer la aritmética en bc, tenga en cuenta la variable especial scale.

+0

la mayor parte del $ (()) con el bc que probé me dio errores. Debe ser por el (())? Gracias por la aclaración. – svenus