Round Funktion
-
Hallo,
warum funktioniert mein Rund-Funktion nicht unter vs2005 aber funktioniert unter 2003.Ich habe alle Header und CPP Dateien vergliechen und mir ist nicht aufgefallen , dass Unterschied gäbe.
# include <math.h> double Ctest_roundView::Round(double Zahl, int Stellen) { double v[] = { 1, 10, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8 }; // mgl. verlängern return floor(Zahl * v[Stellen] + 0.5) / v[Stellen]; }MfG
-
Und wie genau äußert sich der Fehler?
-
Kein Fehler.
nur Eingabe 2.599 Ausgabe 2.5998999999 .
Es soll 2.60 zurückgeben.
in 2003 war so.
-
Das dürfte auf die mangelnde Darstellungsgenauigkeit von double zurückzuführen sein - die Zahl 2.60 passt nicht exakt in einen double-Wert, deshalb wird sie auf den nächstmöglichen Wert gerundet.
(wenn du die Stellenzahl der Ausgabe beschränkst, sollte dann wieder der korrekte Wert auftauchen)
-
also wenn ich 2 Nachkommastellen definiere.
-
in 2003
Round(2.5999 ,2) gibt 2.60 zurück.
in 2005
Round(2.5999 ,2) gibt 2.599989999 zurück.Ich weiss nicht warum.
-
CStoll schieb
(wenn du die Stellenzahl der Ausgabe beschränkst, sollte dann wieder der korrekte Wert auftauchen)Wie beschränke ich es?
-
Das hängt davon ab, wie du den Wert ausgibst:
- printf() oder CString::Format() - du kannst die Stellenzahl in der Formatkennung angeben als "%.2f"
- IO-Streams - die Genauigkeit wird über den precision-Wert gesteuert:
cout<<setprecision(2)<<value;
(andere Ausgabetechniken dürften etwas vergleichbares haben)
-
Aber ich habe mein Wert doch in double Variable.
also CString-Format kann ich nicht.
Wenn ich 2.5998999 in CString umwandele dann beschränke die Wert auf 2.59
danach wndele ich die 2.59 in double kriege ich 2.599999999 zurück.
-
Dann zeig doch mal, was du nach der Rundung mit diesem Wert machst.
-
Ich lege in MSSQL DB und sie wird drin auch komisch --> 2.5999999