Un exemple rapide de ce que je veux utiliser les scripts bash:
#!/bin/bash
echo "Insert the price you want to calculate:"
read float
echo "This is the price without taxes:"
echo "scale=2; $float/1.18" |bc -l
read -p "Press any key to continue..."
bash scriptname.sh
En supposant que le prix est: 48.86 La réponse sera: 41.406779661 (41.40 en fait parce que je l'utilise scale=2;
)
Ma question est la suivante: comment arrondir la deuxième décimale pour afficher la réponse de cette manière ?: 41.41
bc
que je ne peux pas atteindre ce qui est demandé (ou du moins la question que je posais quand j'ai trouvé ce post), qui est comment arrondir les décimales en utilisantbc
(qui est appelé parbash
).r()
fonction, vous pouvez donc l'utiliserbc -le "r($float/1.18, 2)"
.Réponses:
Une fonction bash round:
Utilisé dans votre exemple de code:
Bonne chance: o)
la source
-0.5
$2 = 3
je devais utiliserecho $(env printf %.3f $(echo "scale=3;((1000*$1)+0.5)/1000" | bc))
. Attention à l' environnement avant printf! Cela vous apprendra qu'il est toujours important de comprendre ce que vous copiez depuis ailleurs.if [
écho "$ 1/1" | bc` -gt 0] `- existe-t-il un moyen plus élégant de vérifier (à l'exception de l'analyse de la chaîne de caractères pour" - ")?La solution la plus simple:
la source
+0.5
. Essayezprintf "%.2f\n" "$(bc -l <<<"48.86/1.18")" "$(bc -l <<<"-48.86/1.18")"
et vous obtiendrez41.41
et-41.41
.echo "$float/1.18" | bc -l | xargs printf %.2f
bash: printf: 1.69491525423728813559: invalid number
selon les paramètres régionaux.Bash / awk arrondi:
Si vous avez du python, vous pouvez utiliser quelque chose comme ceci:
la source
echo "$float" |awk '{printf "%.2f", $1/1.18}'
effectuera le calcul demandé de la question à la percision de centièmes demandée. C'est autant "utiliser" que l'bc
appel dans la question.python -c "print(round($num))"
oùnum=4.678923
. Il n'y a pas besoin de perdre son temps avec stdin. Vous pouvez également arrondir à n chiffres comme ceci:python -c "print(round($num, $n))"
.echo 5 | python -c "print int(round((float(raw_input())/2)-0.5))"
(Quand + arrondira et arrondira à la baisse).Voici une solution purement bc. Règles d'arrondi: à +/- 0,5, arrondir à zéro.
Mettez la balance que vous cherchez dans $ result_scale; votre calcul devrait être où $ MATH est situé dans la liste de commande bc:
la source
MATH=-0.34;result_scale=1;bc <<MATH
, #ObjectiveAndClear: 5 comme expliqué ici :)Je sais que c'est une vieille question, mais j'ai une solution pure 'bc' sans 'if' ou branches:
Utilisez-le comme
bcr '2/3' 5
oubcr '0.666666' 2
-> (expression suivie d'une échelle)C'est possible parce qu'en bc (comme C / C ++), il est permis de mélanger des expressions logiques dans vos calculs. L'expression
((t>0)-(t<0))/2)
sera évaluée à +/- 0.5 en fonction du signe de 't' et utilisera donc la bonne valeur pour l'arrondi.la source
bcr "5 / 2" 0
retourne2
au lieu de3
. Est-ce que je manque quelque chose?C'est en fait simple: il n'est pas nécessaire d'ajouter explicitement une variante "-0.5" codée en dur pour les nombres négatifs. Mathématiquement parlant, nous allons simplement calculer la valeur absolue de l'argument et ajouter toujours 0,5 comme nous le ferions normalement. Mais comme nous n’avons (malheureusement) pas de
abs()
fonction intégrée à notre disposition (sauf si nous en codons une), nous allons simplement nier l’argument s’il est négatif.En outre, travailler avec le quotient en tant que paramètre s'est avéré très fastidieux (car pour ma solution, je dois pouvoir accéder au dividende et au diviseur séparément). C'est pourquoi mon script a un troisième paramètre supplémentaire.
la source
echo .. |
, shell arithmetic, à quoi ça sertecho $()
? C'est facile à expliquer: vos chaînes ici nécessiteront toujours un répertoire accessible en écriture/tmp
! Et ma solution fonctionnera également sur un environnement en lecture seule, par exemple un shell racine d'urgence dans lequel l' écriture/
n'est pas toujours accessible en écriture par défaut. Il y avait donc une bonne raison pour laquelle je l'ai codé de cette façon.echo $()
nécessaire? Cela et l'indentation ont incité mes modifications, les herestrings viennent juste d'arriver.echo $()
cela était trop tard pour être réparé était en fait l'avant dernière ligne, lol. Merci pour l'information. Au moins celui-ci a l'air beaucoup mieux maintenant, je ne peux pas le nier. Quoi qu'il en soit, j'ai adoré la logique en cela. Beaucoup de choses booléennes, moins de "if" s (qui feraient sûrement exploser le code de 50%).Je cherche toujours une
bc
réponse pure à la méthode pour arrondir une seule valeur dans une fonction, mais voici unebash
réponse pure :En gros, cela extrait soigneusement les décimales, multiplie tout par 100 milliards (10¹⁰,
10**10
enbash
), ajuste de précision et de l' arrondissement, effectue la division réelle, divise Retour à la grandeur appropriée, et réinsère alors la décimale.Pas à pas:
La
embiggen()
fonction affecte la forme entière tronquée de son argument à$int
et enregistre les nombres après le point dans$fraction
. Le nombre de chiffres fractionnaires est noté dans$precision
. Le calcul multiplie 10¹⁰ par la concaténation de$int
et$fraction
puis ajuste cela pour correspondre à la précision (embiggen 48.86
devient par exemple 10¹⁰ × 4886/100 et renvoie488600000000
ce qui est 488,600,000,000).Nous voulons une précision finale de centièmes. Nous multiplions donc le premier nombre par 100, en ajoutons 5 aux fins de l'arrondi, puis nous divisons le deuxième nombre. Cette cession de
$answer
nous laisse cent fois la réponse finale.Nous devons maintenant ajouter le point décimal. Nous attribuons une nouvelle
$int
valeur pour$answer
exclure ses deux derniers chiffres, puisecho
un point et l’$answer
exclusion de la$int
valeur déjà prise en charge. (Peu importe le bug de mise en évidence de la syntaxe qui le fait apparaître comme un commentaire)(Bashism: l’exponentiation n’est pas POSIX, c’est donc un penchant. Une solution POSIX pure nécessiterait des boucles pour ajouter des zéros plutôt que d’utiliser des puissances de dix. En outre, "embiggen" est un mot parfaitement cromulant.)
L'une des principales raisons pour lesquelles j'utilise
zsh
le shell est qu'il prend en charge les mathématiques en virgule flottante. La solution à cette question est assez simple danszsh
:(J'aimerais beaucoup que quelqu'un ajoute un commentaire à cette réponse en essayant d'activer l'arithmétique en virgule flottante
bash
, mais je suis à peu près sûr qu'une telle fonctionnalité n'existe pas encore.)la source
si vous avez le résultat, considérez par exemple 2.3747888
Tout ce que tu dois faire est:
ceci arrondit correctement le nombre, par exemple:
les décimales sont supprimées par
bc
et donc il arrondit à 2 comme il se doitla source
Je devais calculer la durée totale d'une collection de fichiers audio.
Donc je devais:
A. obtenir la durée de chaque fichier ( non montré )
B. additionnez toutes les durées (elles étaient chacune en
NNN.NNNNNN
(fp) secondes)C. séparez les heures, les minutes, les secondes, les sous-secondes.
D. sort une chaîne de HR: MIN: SEC: FRAMES, où frame = 1/75 sec.
(Les cadres proviennent du code SMPTE utilisé dans les studios.)
A: utiliser
ffprobe
et analyser la ligne de durée dans un nombre fp (non montré)B:
C:
RÉ:
la source
Voici une version abrégée de votre script, corrigée pour fournir le résultat souhaité:
Notez que arrondir au nombre entier le plus proche équivaut à ajouter 0,5 et prendre la parole, ou arrondir à la baisse (pour les nombres positifs).
En outre, le facteur d'échelle est appliqué au moment de l'opération; alors (ce sont des
bc
commandes, vous pouvez les coller dans votre terminal):la source
Pure BC implémentation à la demande
define ceil(x) { auto os,xx;x=-x;os=scale;scale=0 xx=x/1;if(xx>x).=xx-- scale=os;return(-xx) }
si vous mettez cela dans un fichier appelé functions.bc, alors vous pouvez arrondir avec
echo 'ceil(3.1415)' | bc functions.bc
Code pour l'implémentation bc trouvé sur http://phodd.net/gnu-bc/code/funcs.bc
la source
la source
Vous pouvez utiliser awk, aucun tuyau nécessaire:
Définissez le prix au préalable avec la variable d'environnement
PRICE=<val>
.Ensuite, appelez awk -
$PRICE
entrera dans awk en tant que variable awkprice
.Il est ensuite arrondi au 100ème le plus proche avec +.005.
L'option de formatage printf
%.2f
limite l'échelle à deux décimales.Si vous devez faire cela beaucoup de cette façon, c'est beaucoup plus efficace que la réponse choisie:
la source