bc: Anzahl der Nachkommastellen einstellen


52

bc Behandelt Zahlen als Ganzzahlen:

# echo "100/3" | bc
33

bc -l behandelt Zahlen als Gleitkommaobjekte:

# echo "100/3" | bc -l
33.33333333333333333333

Gibt es eine Möglichkeit, die Anzahl der Nachkommastellen zu begrenzen?


10
Interessanterweise funktioniert dies nur mit Division. Wenn du das machen willst, musst scale=0;1234*1.1du es so schreiben, dass es scale=0;1234*1.1/1kommt 1357. Ansonsten scalebekommst du, egal welchen Wert du hast 1357.4.
Wok

Sollte der Kommentar von @Wok nicht eher die akzeptierte Antwort als die Frage sein? Bis ich die Antwort gelesen hatte, hatte ich keine Ahnung, worauf sich dieser Kommentar bezog.
Wilson F

1
@WilsonF Der Antwort wurde ein Verweis hinzugefügt.
Adam Matan

2
@ Wok, es ist nicht abhängig von Division oder Multiplikation. Es kommt auf die Eingabe an - die größte Genauigkeitszahl bestimmt die Genauigkeit in der Ausgabe. Beachten Sie, wie 1234*1.0Sie geben werden1234.0
Richlv

Antworten:


70

Stellen Sie die scalespezielle Variable ein:

$ echo "scale=2; 100/3" | bc
33.33

3
Siehe @ Woks Kommentar zur Frage.
Adam Matan

$ echo "scale=2; (100/180)*180" | bcgibt 99.00 :(
Donatas Olsevičius

@ DonatasOlsevičius Dies liegt daran, dass (100/180) = 0,55 und dann (0,55 * 180) = 99. Es gibt Ihnen also den richtigen Wert :)
Kamaldeep singh Bhatia

Es wäre schön, wenn es oben aufgerundet würde .5. ~$ echo "scale=2; 12/104" | bc .11 Aufgerundet wäre dies .12. Es sollte jedoch immer noch die Arbeit für meine Aufgabe erledigen.
Jbrock

3
Sie können bis Drucken der Wert auf diese Weise Präzision beibehalten: echo "result = (100/180) * 180; scale=2; result / 1" | bc -l. Jetzt verstehst du 99.99.
Byron Hawkins

10

scalefunktioniert nur für die Teilung; Wenn es einige Geeks bei der Multiplikation benötigen, können Sie dies durch die Verwendung von String-Manipulationen erreichen. Sagen Sie, wenn Sie multiplizieren müssen 32 * 0.60, ist die Antwort 19.20. Wenn Sie es allein als Antwort benötigen, können Sie es auf verschiedene Arten erhalten.

  1. String-Manipulation verwenden

    $ S=$(echo "32*.60" | bc ) ; echo ${S%.*}
    19
    

    Syntax zur Manipulation von Zeichenfolgen: ${Variable%pattern}Hiermit werden die folgenden kurzen Übereinstimmungsmuster gelöscht %. Weitere Informationen zur String-Bearbeitung finden Sie im Advanced Bash-Scripting Guide .

  2. Verwendung Scalewie von angegeben**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. Um die nachgestellten Nullen loszuwerden, kann anstelle der Manipulation von Zeichenfolgen auch eine Division durch 1 durchgeführt werden.

    $ echo "0.232 * 1000" | bc
    232.000
    
    $ echo "0.232 * 1000 / 1" | bc
    232
    

Beachten Sie, dass, wie ich in meinem Kommentar zu der Frage erwähnt habe, dies nicht durch Multiplikation, sondern durch die Eingabe von Zahlen mit einem Dezimalteil verursacht wird. Anders ausgedrückt bestimmt die Zahl mit dem "längsten" Dezimalteil, wie viele Dezimalstellen die Ausgabe haben wird.
Richlv

4

Zusätzlich zu früheren Antworten

echo "scale=2; 1.0150876" | bc

Kehrt zurück

1.0150876

Addiere mathematische Operationen, um nur 2 Dezimalzahlen zu erhalten - (NUMBER * 100) / 100

echo "scale=2; (1.0150876 * 100) / 100" | bc

Jetzt kehrt zurück

1.01

3

Sie können auch den Befehl printf verwenden, um das Ergebnis auf 3 Dezimalstellen abzurunden

# printf "%.3f\n" $(echo "100/3" | bc -l)
3.333

2

Abrunden

scale = 2 schneidet die Antwort auf zwei Dezimalstellen ab, aber wir können eine Abrundung wie folgt erzielen:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.