2016-09-05 5 views
0
5+50*3/20 + (19*2)/7 = 17.9285714286 
        = 17.929 

Ich möchte den genauen Wert auf 3 Dezimalstellen abgeschnitten, das ist 17.929 durch Ausführen der folgenden Bash-Operation.Warum Rundungsfehler in bash?

echo " scale = 3; 5+50*3/20 + (19*2)/7 " | bc 

Aber es gibt mir den Wert 17.928.

$ echo " scale = 3; 5+50*3/20 + (10*9)/7 " | bc 
17.928 

Was kann ich tun ??

N.B .: Dies ist ein Hackerrank challenge. Auch wenn es in ihrer Konsole keine korrekte Ausgabe gibt.

Antwort

3

Wenn Sie scale=3 in bc verwenden, sind Sie nicht nur die Anzahl der Dezimalstellen in der Ausgabe anzugeben, sind Sie die Anzahl der Dezimalstellen begrenzt, die bc nutzt ihre zu tun Berechnungen.

die korrekte Ausgabe zu erhalten, verwenden printf mit bc:

$ printf '%.3f\n' "$(bc -l <<<'5+50*3/20 + (19*2)/7')" 
17.929 

Wenn der Ausdruck in einer Variablen $var ist, ersetzen Sie die Zeichenfolge in einfache Anführungszeichen mit "$var".

+0

Danke! Es ist mir jetzt klar :) – jbsu32

4

bc ist eher der Dezimalwert als Abrundung. Sie können awk verwenden:

awk 'BEGIN{printf "%.3f\n", 5+50*3/20 + (19*2)/7}' 
17.929 
+0

Vielen Dank! Es funktioniert! Aber, wie eine Variable zu verarbeiten? Ich meine, "awk" BEGIN {printf "% .3f \ n", $ a} ''gibt die Ausgabe' 0.000 '. – jbsu32

+0

Sie können verwenden: 's = '5 + 50 * 3/20 + (19 * 2)/7'; awk 'BEGIN {printf "% .3f \ n",' "$ s" '}' 'in diesem Fall. – anubhava

Verwandte Themen