Mit printf 49,765 auf 49,77 runden?

Mit printf 49,765 auf 49,77 runden?

49,765 ist meine Ausgabe aus einem Ring von Befehlen. Ich möchte print f verwenden, um es um zwei Dezimalstellen auf 49,77 zu runden.

Wie lautet der Code dafür?

Antwort1

$ x=49.765
$ printf "%.2f" $(echo "$x + 0.005" | bc)

Sie müssen externe Befehle verwenden, da in keine integrierte Rundungsfunktion vorhanden ist printf(1)und die POSIX-Shell keine integrierte Gleitkommaarithmetik hat.

Um auf die nächste Dezimalstelle zu runden, addieren Sie 0,5 und kürzen. Um auf die nächste Zehntelstelle zu runden, dividieren Sie den „Nudge-Faktor“ durch 10 und so weiter.

Dieser Mangel an integrierten Funktionen ist der Grund, warum Benutzer häufig lieber etwas wie Perl als eine Shell verwenden:

$ perl -e 'printf "%.2f", 49.765 + 0.005'

Dasselbe, aber alles wird von einem einzigen Prozess gehandhabt.

Antwort2

Zum Abrunden können Sie folgenden Befehl verwenden.

Gleitkommazahl = 49,765; printf("%0,2f", Zahl);

Sie sollten in der Lage sein, die beiden Ziffern nach dem Komma zu erhalten.

Dies wird jedoch nur gedruckt, der Wert wird nicht aktualisiert. Wenn Sie den Wert der Variablen ändern möchten, sollten Sie Folgendes verwenden.

#include <math.h>

float val = 49.765;

float rounded_down = floorf(val * 100) / 100;   /* Result: 49.76 */
float nearest = roundf(val * 100) / 100;  /* Result: 49.77 */
float rounded_up = ceilf(val * 100) / 100;      /* Result: 49.77 */

Beachten Sie, dass Sie zwischen drei verschiedenen Rundungsregeln wählen können: Abrunden (d. h. Abschneiden nach zwei Dezimalstellen), Aufrunden auf den nächsten Dezimalwert und Aufrunden. Normalerweise möchten Sie auf den nächsten Dezimalwert runden.

Wie mehrere andere bereits angemerkt haben, entsprechen diese gerundeten Werte aufgrund der Eigenheiten der Gleitkommadarstellung möglicherweise nicht exakt den „offensichtlichen“ Dezimalwerten, kommen diesen aber sehr, sehr nahe.

Antwort3

Erfassen Sie die Ausgabe des „Befehlsrings“ in einer Variablen und verwenden Sie printf.

$ x=49.765

$ printf '%.2f\n' "$x"
49.76

Die Rundung erfolgt über die binäre Darstellung der Zahl mit der Regel „Auf nächste Zahl aufrunden“. Bitte haben Sie Verständnis dafür, dass die binäre Darstellung in den meisten Fällen nicht exakt der angegebenen Zahl entspricht.

verwandte Informationen