Wie kann ich bc
Dezimalzahlen mit einer führenden Null beginnen?
$ bc <<< 'scale=4; 1/3'
.3333
Ich möchte 0,3333.
Antwort1
bc
unterstützt das Hinzufügen von Nullen nicht nativ.
Die Problemumgehung ist:
echo 'scale=4; 1/3' | bc -l | awk '{printf "%.4f\n", $0}'
0.3333
\n
– Beenden Sie die Ausgabe mit einer neuen Zeile.%f
– Gleitkomma%.4f
– die Anzahl der anzuzeigenden Ziffern. Dies gibt 4 Ziffern nach dem Dezimalpunkt an.
Antwort2
Leider bc
ist es so geschrieben, dass Sie das nicht können. Diese Aussage gilt auch für das benachbarte dc
. Als Lösung wird normalerweise vorgeschlagen, ein Textverarbeitungsprogramm zu verwenden, um bc
die Ausgabe zu ändern, oder ein völlig anderes Programm wie perl
oder python
mit anderer Syntax zu verwenden, aber für mich scheinen sie für eine so einfache Aufgabe zu schwerfällig zu sein.
Aus Ihren anderen Fragen geht hervor, dass Sie zsh
Benutzer sind. Ich würde daher vorschlagen zcalc
, das eine sehr ähnliche Syntax für grundlegende Operationen hat, wie bc
:
$ zcalc -e '1/3'
0.333333
Zuerst müssen Sie diese Funktion laden (z. B. innerhalb .zshrc
) und wahrscheinlich möchten Sie alle Zahlen immer als Gleitkommazahlen behandeln mit -f
der folgenden Option:
autoload -U zcalc
alias zcalc='zcalc -f'
Als Bonus können Sie mit ZCALCPROMPT
Parametern eine spezielle Eingabeaufforderung für den Rechner definieren, Einzelheiten finden Sie unter man zshcontrib
.
Antwort3
bc
kann dazu überredet werden, eine führende Null zu verwenden:
for div in 10 1000; do
echo "scale=3;v=158/$div; if(v > -1 && v < 1) print 0,v,\"\n\" else print v, \"\n\"" | bc
done
Antwort4
Dies ist eine Lösung mit allen Mitteln, die die Fehler meiner vorherigen Antwort behebt. Diese kleine Funktion findet einigermaßen intelligent heraus, wann und wo die führende 0 und das Minuszeichen eingefügt werden müssen, und verwendet den backspace
Steuercode, um im gedruckten Wert rückwärts zu gehen. Dies funktioniert nicht im Posix- -s|--standard
Modus (oder wenn es auf einem Teletype gedruckt wird!):
#!/usr/bin/env bc
# this is lz.bc
define lz(d) {
if (ibase != 10 || obase != 10) {
print "(io)base must be decimal (10)\n"
return -1
}
n=0; b=0; a=0
if (d<0) n=1 # negative
if (d>-1 && d<0) b=1 # below
if (d>0 && d<1) a=1 # above
print " ", d
for (i=length(d)+1; i>=0; i--) {
print "\b"
if(i==0 && (b || a)) print "0\b\b"
}
if(n) print "-"
print "\n"
return 0
}
v[0]=-.234
v[1]=.234
v[2]=-2.345
v[3]=2.345
v[4]=-123.4567
v[5]=123.456
for(x=0;x<6;x++) {
print v[x], " ... "
r=lz(v[x])
}
obase=16
r=lz(v[5])
quit
welches beim Aufrufen Folgendes anzeigt:
$ bc lz.bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
-.234 ... -0.234
.234 ... 0.234
-2.345 ... -2.345
2.345 ... 2.345
-123.4567 ... -123.4567
123.456 ... 123.456
(io)base must be decimal (10)