arithmetic bash floating-point rounding fixed-point

bash - arithmetic - ¿Cómo usar expr en float?



bc calculator (5)

Sé que es una pregunta realmente estúpida, pero no sé cómo hacer esto en bash:

20 / 30 * 100

Debería ser 66.67 pero expr dice 0 , porque no soporta float. ¿Qué comando en Linux puede reemplazar a expr y hacer esta ecualización?


Como se informó en la página de manual de bash:

El shell permite evaluar expresiones aritméticas, en determinadas circunstancias ... La evaluación se realiza en enteros de ancho fijo sin comprobación de desbordamiento, aunque la división por 0 se captura y se marca como un error.

Puedes multiplicar por 100 antes para obtener un mejor resultado parcial:

let j=20*100/30 echo $j

66

O por un múltiplo más alto de 10, e imagina el lugar decimal al que pertenece:

let j=20*10000/30 echo $j

66666


Generalmente uso perl:

perl -e ''print 10 / 3''


solo hazlo en awk

# awk ''BEGIN{print 20 / 30 * 100}'' 66.6667

guardarlo en variable

# result=$(awk ''BEGIN{print 20 / 30 * 100}'') # echo $result 66.6667


bc hará esto por ti, pero el orden es importante.

> echo "scale = 2; 20 * 100 / 30" | bc 66.66 > echo "scale = 2; 20 / 30 * 100" | bc 66.00

o, para su caso específico:

> export ach_gs=2 > export ach_gs_max=3 > x=$(echo "scale = 2; $ach_gs * 100 / $ach_gs_max" | bc) > echo $x 66.66

Sea cual sea el método que elija, este está listo para ser incluido como una función para facilitar su vida:

#!/bin/bash function pct () { echo "scale = $3; $1 * 100 / $2" | bc } x=$(pct 2 3 2) ; echo $x # gives 66.66 x=$(pct 1 6 0) ; echo $x # gives 16


> echo "20 / 30 * 100" | bc -l 66.66666666666666666600

Esta es una simplificación de la respuesta por paxdiablo. El -l establece la escala (número de dígitos después del decimal) a 20. También carga una biblioteca matemática con funciones trigonométricas y otras cosas.