web-dev-qa-db-fra.com

"Opérateur arithmétique invalide" faisant des calculs en virgule flottante dans bash

Voici mon scénario, assez explicite:

d1=0.003
d2=0.0008
d1d2=$((d1 + d2))

mean1=7
mean2=5
meandiff=$((mean1 - mean2))

echo $meandiff
echo $d1d2

Mais au lieu d’obtenir ma sortie prévue de: 0.0038 2 Je reçois l’erreur Invalid Arithmetic Operator, (error token is ".003")?

11
John Smith

bash ne supporte pas l'arithmétique à virgule flottante. Vous devez utiliser un utilitaire externe tel que bc.

# Like everything else in Shell, these are strings, not
# floating-point values
d1=0.003
d2=0.0008

# bc parses its input to perform math
d1d2=$(echo "$d1 + $d2" | bc)

# These, too, are strings (not integers)
mean1=7
mean2=5

# $((...)) is a built-in construct that can parse
# its contents as integers; valid identifiers
# are recursively resolved as variables.
meandiff=$((mean1 - mean2))
24
chepner

Si vous n’avez pas besoin de précision en virgule flottante, vous pouvez simplement enlever la partie décimale.

echo $var | cut -d "." -f 1 | cut -d "," -f 1

coupe la partie entière de la valeur. L’utilisation de couper deux fois permet d’analyser la partie entière au cas où un paramètre régional pourrait utiliser des points pour séparer les décimales et que d’autres pourraient utiliser des virgules.

0
MT San