GNU/Linux >> Tutoriels Linux >  >> Linux

bc tronquer le nombre à virgule flottante

Utilisez / opérateur.

echo '(4.2-1.3) / 1' | bc

Essayez la solution suivante. Il tronquera tout ce qui se trouve après la virgule sans problème :

echo 'x = 4.2 - 1.3; scale = 0; x / 1' | bc -l
echo 'x = l(101) / l(10); scale = 0; x / 1' | bc -l

Vous pouvez raccourcir un peu le code en effectuant des calculs directement sur les nombres :

echo 'scale = 0; (4.2 - 1.3) / 1' | bc -l
echo 'scale = 0; (l(101) / l(10)) / 1' | bc -l

En général, vous pouvez utiliser cette fonction pour obtenir uniquement la partie entière d'un nombre :

define int(x) {
    auto s;
    s = scale;
    scale = 0;
    x /= 1; /* This will have the effect of truncating x to its integer value */
    scale = s;
    return (x);
}

Enregistrez ce code dans un fichier (appelons-le int.bc ) et exécutez la commande suivante :

echo 'int(4.2 - 1.3);' | bc -l int.bc

La division par 1 fonctionne bien si scale est 0 (par exemple, si vous commencez bc avec bc et ne changez pas scale ) mais échoue si scale est positif (par exemple, si vous commencez bc avec bc -l ou augmenter scale ). (Voir la transcription ci-dessous.) Pour une solution générale, utilisez un trunc fonctionner comme suit :
define trunc(x) { auto s; s=scale; scale=0; x=x/1; scale=s; return x }

Transcription illustrant comment la division par 1 par elle-même échoue dans le bc -l cas, mais comment trunc la fonction fonctionne correctement pour tronquer vers zéro :

> bc -l
bc 1.06.95
[etc...]
for (x=-4; x<4; x+=l(2)) { print x,"\t",x/1,"\n"}
-4  -4.00000000000000000000
-3.30685281944005469059 -3.30685281944005469059
-2.61370563888010938118 -2.61370563888010938118
-1.92055845832016407177 -1.92055845832016407177
-1.22741127776021876236 -1.22741127776021876236
-.53426409720027345295  -.53426409720027345295
.15888308335967185646   .15888308335967185646
.85203026391961716587   .85203026391961716587
1.54517744447956247528  1.54517744447956247528
2.23832462503950778469  2.23832462503950778469
2.93147180559945309410  2.93147180559945309410
3.62461898615939840351  3.62461898615939840351
define trunc(x) { auto s; s=scale; scale=0; x=x/1; scale=s; return x }
for (x=-4; x<4; x+=l(2)) { print x,"\t",trunc(x),"\n"}
-4  -4
-3.30685281944005469059 -3
-2.61370563888010938118 -2
-1.92055845832016407177 -1
-1.22741127776021876236 -1
-.53426409720027345295  0
.15888308335967185646   0
.85203026391961716587   0
1.54517744447956247528  1
2.23832462503950778469  2
2.93147180559945309410  2
3.62461898615939840351  3

Linux
  1. Nombre de fichiers contenant une chaîne donnée ?

  2. Nombre de lignes produites par Ls ?

  3. Calculer le nombre de jours avant le paiement ?

  4. Incrémenter le numéro de build dans Bash ?

  5. Arrondir un nombre divisé en Bash

Écrire un jeu de devinettes dans ncurses sous Linux

Bash pour la boucle

Expression de séquence bash (plage)

Bash Select (créer des menus)

Comment envoyer un ping à un numéro de port sous Linux

Comment envoyer un ping à un numéro de port spécifique