zur Übersicht nächste Seite

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
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
}

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

zur Übersicht nächste Seite

Datenschutzerklärung
Impressum