2012-10-05 7 views
8

Ich versuche, die Nummer mit 2 Punkten Genauigkeit in dem Sinne, dass die Zahl abgeschnitten (nicht abgerundet) nach 684.54.Wie wird eine Gleitkommazahl nach einer bestimmten Anzahl von Dezimalstellen abgeschnitten (keine Rundung)?

Wenn ich

var = 684.545007; 
printf("%.2f\n",var); 

es gibt 684.55, aber was ich möchte ist bekommen 684.54.

Weiß jemand wie kann ich das korrigieren?

+4

Warum haben Sie eine 4 erwartet? – chris

+9

Wenn Sie '684.54' erwarteten, haben Sie das falsche Ergebnis erwartet. So einfach ist das. –

+0

Weil ich keinen abgerundeten Wert möchte. Dieser Code ist Teil einer Programming Online Judge-Code-Lösung. – vhbsouza

Antwort

22

Was Sie suchen, ist Trunkierung. Dies sollte (zumindest für Zahlen, die nicht sehr groß sind) arbeiten:

printf(".2f", ((int)(100 * var))/100.0); 

Die Umstellung auf integer kürzt den Bruchteil.

In C++ 11 oder C99, können Sie die spezielle Funktion trunc für diesen Zweck (von den <cmath> oder <math.h> Header verwendet werden. Dadurch wird die Beschränkung auf Werte vermeiden, die zu einem integralen Typ passen.

std::trunc(100 * var)/100  // no need for casts 
+0

Wenn Sie eine C99-Standardbibliothek haben, können Sie 'trunc()' verwenden, was für einen viel größeren Zahlenbereich funktioniert. – caf

+0

@caf: Danke, ich habe das hinzugefügt. Ich frage mich, ob jemand "lrint()" für die erste Lösung vorschlagen wird. –

1
printf("%.2f\n", var - 0.005); 
+9

Da .005 nicht genau darstellbar ist, wird dies zwangsläufig zu einem falschen Ergebnis für einige Werte führen. –

2

Hier ist mein Ansatz. Es scheint, hässlich, aber funktioniert in den meisten Fällen zB var kann dann int größer sein kann null oder bizarr ‚-0‘. Es ist nicht Unendlichkeiten und NaNs allerdings nicht handhaben.

double var = 684.545007; // or whatever 
double var_trunc = var>=0. ? floor(var*100.)/100. : ceil(var*100.)/100.; 
printf ("%g\n", var_trunc); 
Verwandte Themen