Comment comparer deux valeurs à virgule flottante en script shell
J'ai eu à faire une division en script shell et la meilleure façon est:
result1=`echo "scale=3; ($var1 /$total) * 100"| bc -l`
result2=`echo "scale=3; ($var2 /$total) * 100"| bc -l`
mais je veux comparer les valeurs de $result1
et $result2
À l'aide de if test $result1 -lt $result2
ou if [ $result1 -gt $result2 ]
n'a pas fonctionné 🙁
Aucune idée de comment faire cela?
OriginalL'auteur Reem | 2010-05-04
Vous devez vous connecter pour publier un commentaire.
Vous pouvez comparer les nombres à virgule flottante à l'aide de
expr(1)
:Vous pouvez également avoir
bc
faire les comparaisons ainsi que les calculs:Enfin, ksh93 peut effectuer des calculs arithmétiques évaluation
$(($result1 < $result2))
avec des nombres à virgule flottante, bien que bash ne peut.OriginalL'auteur Norman Ramsey
note que vous avez obtenu d'être un peu prudent lorsque vous traitez avec des nombres à virgule flottante et si vous testez pour l'égalité vous voulez vraiment vous décider sur un certain degré de précision, puis de comparer à l'aide que. Quelque chose comme:
la raison étant que, avec les ordinateurs, nous sommes face avec peu de précision binaire fractions n'est pas vrai mathématique réels. La limitation de la précision de la c.-b. à l'échelle=3 aura cet effet.
Je voudrais aussi vous déconseillons d'essayer de faire ce genre de choses dans un script shell. Ce n'est pas que vous ne pouvez pas le faire, mais vous aurez à bifurquer plein de petits sous-commandes pour faire le difficile bits et qui est lent à s'exécuter et généralement une douleur à écrire - vous passez la plupart de votre temps à essayer d'obtenir le shell pour faire ce que vous voulez plutôt que d'écrire le code que vous voulez vraiment. Déposez-les dans une version plus sophistiquée langage de script au lieu de cela, mon choix de la langue est du perl, mais il en existe d'autres. c'est comme ça...
notez également que vous êtes en divisant par la même valeur ($total dans votre question), donc l'ensemble de la comparaison peut être faite contre les numérateurs (var1 et var2) $total est positif
OriginalL'auteur Nick
De poster une nouvelle réponse car je ne peux pas encore de commentaire...
@Norman Ramsey réponse n'est pas tout à fait exact:
expr
va effectuer un entier ou une chaîne de comparaison, n'a floating-point de comparaison.Voici ce que la page de man dit:
(juste essayer
expr 8.9 '<' 10
et obtenir0
où il devrait être1
).bc
fonctionne très bien, mais n'est pas toujours installé.Donc une autre alternative est d'utiliser
perl -e
:perl -e 'print expression'
imprime1
si l'expression est vraie et rien (chaîne vide) sinon.par exemple
perl -e 'print 8.9 < 10'
- imprime "1", tandis queperl -e 'print 2>4'
imprime rien.Et lorsqu'il est utilisé dans
if
déclaration:if [ $(perl -e "print $result1 < $result2") ];then ... fi
OriginalL'auteur Yoav Aharoni