bc zweistellig runden Generell gilt bei den weißen Textstellen auf dieser Seite: Man fügt die Zeichenfolge aus dem weißen Feld bei dem blinkenden Cursor des Terminals ein - dann drückt man die Eingabetaste. Das Rechenprogramm bc schneidet Nachkomma-Punkt-Stellen ab und rundet nicht kaufmännisch auf oder ab. Hier soll bc ergänzt werden zu einem Programm das zweistellig auf- oder abrundet.Zunächst gibt es in bc mit der scale=n Funktion (n=0,1,2,3,4....) die Möglichkeit das Ergebnis auf n Stellen hinter dem Komma-Punkt zu begrenzen. Allerdings gibt es dabei manchmal Überraschungen |
echo "scale=1;(11.647+0.05)" | bc |
11.697 Obwohl mit scale=1 nur eine Stelle nach dem Komma-Punkt gewünscht wurde, wird ein dreistelliges Nachkomma-Punkt-Ergebnis angezeigt. Der Grund dafür liegt wohl daran, daß bei den Eingabezahlen diejenige ausgewählt wird die die meisten Nachkomma-Punkt-Stellen besitzt und diese Anzahl wird für das Ergebnis benutzt auch wenn mit scale= ein anderer Wert gewünscht wurde. Nun gibt es einen kleinen Trick um dieses Verhalten auszuhebeln und die gewünschte scale= zu erhalten: Man teilt durch 1 |
echo "scale=1;(11.647+0.05)/1" | bc |
11.6 Die weiteren Stellen werden abgeschnitten. Für die gewünschte zweistellige Rundung untersucht man die dritte Stelle hinter dem Komma-Punkt. Zunächst werden die Nachkomma-Punkt-Stellen abgetrennt mit cut wobei als Trennzeichen . benutzt wird |
sA=$(echo "(11.647+0.05)" | bc -ql | cut -f 2 -d '.'); echo $sA |
697 Dann wird die dritte Nachkomma-Punkt-Stelle herausgeschnitten |
echo ${sA:2:1} |
7 Dann wird untersucht ob diese Zahl kleiner als 5 ist und dementsprechend werden die Rechenoperationen festgelegt |
bc2rd() { sA=$(echo $1/1 | bc -ql | cut -f 2 -d '.') sB=$(echo $1/1 | bc) if [ ${sA:2:1} -lt 5 ] ; then else if [ $sB -lt 0 ] ; then else fi |
Man kann bc2rd (bc 2-stellig
runden) im System als Programm bekannt machen indem man dieses in die
Datei ~/.bashrc schreibt. Also öffnet man diese Datei ~/.bashrc
etwa mit gedit und sucht nach dem Wort some . In einer Zeile darunter
schreibt man bc2rd() { sA=$(echo $1/1 | bc -ql | cut -f 2 -d '.'); sB=$(echo $1/1 | bc); if [ ${sA:2:1} -lt 5 ] ; then echo "scale=2; $1/1" | bc ; else if [ $sB -lt 0 ] ; then echo "scale=2; $1/1-0.01" | bc; else echo "scale=2; $1/1+0.01" | bc; fi; fi; } Dann speichert man den geänderten Text von ~/.bashrc ab. Damit ist bc2rd zu einem Programm geworden. Zunächst rechnet man und schreibt das Ergebnis in eine Variable |
sE=$(echo "121/17" | bc -ql); echo $sE |
7.11764705882352941176 Dann wird gerundet |
bc2rd $sE |
7.12 Wenn man positive Zahlen als zweistellige EURO-Preise auf die nächsthöheren 5 cent aufrunden möchte so kann man verwenden |
bc2r5() { sA=$(bc2rd $1 | cut -f 2 -d '.') sR=$(echo "scale=1; $1/1" | bc) if [ ${sA:1:1} -eq 0 ] ; then echo $(bc2rd $1) elif [ ${sA:1:1} -le 5 -a ${sA:1:1} -gt 0 ] ; then echo "scale=2; $sR/1 +0.05" | bc else echo "scale=2; $sR/1 +0.1" | bc fi } |
Hierbei werden .z00 bis
.z049 auf den Wert .z0 geschrieben und .z05 auf den Wert .z5 für jede Ziffer z Hierbei werden .z50 bis .z549 auf den Wert .z5 geschrieben und .z55 auf den Wert .(z+1)0 für jede Ziffer z Insbesondere also |
bc2r5 $sE |
7.15 |
bc2r5 7.004 |
7.00 |
bc2r5 7.005 |
7.05 |
bc2r5 7.054 |
7.05 |
bc2r5 7.055 |
7.10 |