2010-08-01 28 views
8

Gibt es eine Möglichkeit, Gleitpunkte auf 2 Punkte zu runden? Zum Beispiel: 3576.7675745342556 wird 3576.76.Gleitkommazahl begrenzen?

+4

Meinst du für Anzeige oder Berechnung? –

+2

3576.7675745342556 wird 3576.77, oder? – Vladimir

+2

@Vladimir: Nicht nervig. Runden ist ein vager Begriff, der mehrere verschiedene Operationen mit einer genaueren Bedeutung kapselt. Round Up/Down/In Richtung Null/In Richtung Unendlichkeit/In Richtung nächster Int. –

Antwort

12
round(x * 100)/100.0 

Wenn Sie müssen die Dinge schwimmt:

roundf(x * 100)/100.0 

Flexible Version mit Standard-Bibliotheksfunktionen:

double GetFloatPrecision(double value, double precision) 
{ 
    return (floor((value * pow(10, precision) + 0.5))/pow(10, precision)); 
} 
+3

Beachten Sie, dass die binäre Fließkommazahl nicht genau die meisten Dezimalwerte darstellen kann. Diese Antwort funktioniert nicht, wenn Sie die unteren Ziffern genauer untersuchen. Aber andererseits kann auch keine andere Antwort. –

2

Multiplizieren mit 100, rund um Integer (wie man will), Division durch Beachten Sie, dass, da 1/100 nicht präzise in Gleitkommazahlen dargestellt werden kann, die Berücksichtigung von Ganzzahlen mit fester Genauigkeit in Betracht gezogen werden sollte.

+1

Dezimale Festkommazahlen sind hier möglicherweise die richtige Antwort. – caf

-5
yourFloatNumber= Float.Round(yourFloatNumber,2); // In C# 
+4

Das funktioniert in Java. Wenn Sie genau hinschauen, hat das Poster es mit c/C++ markiert. – carlsborg

13

Wenn Sie es ausdrucken, verwenden Sie stattdessen die Ihnen zur Verfügung stehende Druckformatierungsfunktion.

In C++

cout << setprecision(2) << f; 

Für Rundung auf GUI zu machen, verwenden Sie std :: ostringstream

+5

Beziehe dich nie auf eine andere Antwort mit "wie oben erwähnt". Die Reihenfolge, in der die Antworten angezeigt werden, variiert im Laufe der Zeit und entsprechend den vom Benutzer konfigurierbaren Voreinstellungen (nach Zeit oder Anzahl der Stimmen). Um Ihren speziellen Punkt anzusprechen, kann 'floor' oder' ceil' anstelle von Ganzzahlen verwendet werden. –

+1

Warum nicht 'printf' verwenden? – Svante

+1

@Svante, weil wir C++ verwenden? – Craig

2

Keine floats verwenden. Verwenden Sie Ganzzahlen, die die Anzahl der Cents speichern, und drucken Sie einen Dezimalpunkt vor den letzten 2 Stellen, wenn Sie Dollar drucken möchten. Floats sind fast immer falsch für Geld, es sei denn Sie simple Berechnungen (wie naive ökonomische mathematische Modelle) tun, wo nur die Größe der Zahlen wirklich zählt und Sie nie in der Nähe Zahlen abziehen.

0

die Genauigkeit zu begrenzen:
Wenn x einen Schwimmer, keine Rundung:
(Verschiebung um 2 Dezimalstellen auf, die Fraktion abzustreifen, um 2 Dezimalstellen herunterschalten)

((int)(x*100.0))/100.0F 

Float w/Rundung:

((int)(x*100.0 + 0.5F))/100.0F 

Doppel w/o Rundung:

((long int)(x*100.0))/100.0 

Doppel w/Rundung:

((long int)(x*100.0 + 0.5))/100.0 

Hinweis: Da x entweder ein float oder ein double, wird immer der Bruchteil dort sein. Es ist der Unterschied zwischen der Darstellung eines # (IEEE 754) und der # Präzision.
C99 unterstützt round()

0

try

std::cout<<std::setprecision(2)<<std::cout<<x;

sollte funktioniert und nur 2 Ziffer nach dem Floating-Point angezeigt.

2

Für diejenigen unter Ihnen googeln einen Schwimmer, um Geld zu formatieren, wie ich war:

#include <iomanip> 
#include <sstream> 
#include <string> 

std::string money_format (float val) 
{ 
    std::ostringstream oss; 

    oss << std::fixed << std::setfill ('0') << std::setprecision (2) << val; 

    return oss.str(); 
} 
// 12.3456 --> "12.35" 
// 1.2 --> "1.20" 

Sie müssen es als String zurück. Setzen Sie es in einen Schwimmer zurück, wird die Präzision verlieren.

0

Versuchen Sie dieses, es funktioniert perfekt

float=3576.7675745342556; 
printf("%.2f",float); 

ändern einige Objekte in den Code zu sehen und zu lernen.