Abschneiden einer decimal-Wert in C++
Was ist der einfachste Weg abschneiden eine C++ float
variable, der ein Wert von 0.6000002 auf einen Wert von 0.6000 und speichern Sie es zurück in die variable?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst ist es wichtig zu wissen, dass floating-point-zahlen sind angenähert. Siehe den link von @Greg Hewgill, um zu verstehen, warum dieses problem ist nicht vollständig lösbar.
Aber hier sind ein paar Lösungen für das problem, die wird wahrscheinlich erfüllen Ihre Notwendigkeit:
Wohl die bessere Methode aber weniger effizient:
Der effizientere Weg, aber vermutlich weniger präzise:
Eine gute Referenz für warum dies geschieht, finden Sie in Was Jeder Computer Scientist Should Know About Floating-Point Arithmetic von David Goldberg.
Realistisch ist das nicht möglich. Es ist kein C++ Einschränkung, sondern gerade die Weise, die floating point arbeitet. Für viele Werte gibt es keine genauen zusagen, so können Sie nicht einfach abschneiden, um eine Anzahl von stellen.
Könnte man abschneiden beim drucken Verwendung von printf-format-strings.
Wenn Sie wirklich brauchen, um in der Lage zu speichern nur eine begrenzte Anzahl von Ziffern, ich schlage vor, Sie verwenden eine Feste-precision-Datentyp statt.
ich denke, die Frage, die hier gestellt werden sollte ist:
Warum müssen Sie es abgeschnitten?
Wenn Ihr einen Vergleich zwischen den Werten, sollten Sie vielleicht erwägen den epsilon-test. (mit einer extra-Toleranz-Wert, in deinem Fall, da es scheint zu sein, weit größer als die allgemein akzeptierte epsilon).
Wenn Sie nur wollen, drucken Sie es aus, wie 0.6000 , die Methoden verwenden, die andere vorgeschlagen haben.
Zum Beispiel, in deinem Fall bist du mit dem abschneiden von drei Ziffern (numDigits). Sie würden verwenden:
(Sie würde wahrscheinlich das Ergebnis speichern von powf irgendwo, da Sie es zweimal.)
Wegen, wie Sie schwimmt normalerweise auf Computern gespeichert werden, würde es wahrscheinlich zu Ungenauigkeiten. Das ist, was Sie erhalten, für die Verwendung von floats, obwohl.
Verwenden:
Für C++11 können Sie
std::round
definiert im header<cmath>
:Hier ist eine Funktion, mit der Beratung in anderen Antworten und ein Beispiel für die Verwendung:
Ähnlich zu anderen Antworten, ABER Sie dürfen nicht vergessen, dass die Runde, auf dem Boden und Rumpf unterschiedlich sind per definition. Siehe die definition und Ausgabe-Beispiel der folgende:
http://www.cplusplus.com/reference/cmath/trunc/
In diesem Fall müssen wir trucate mit einer Genauigkeit von 4 Dezimalstellen und loswerden von nicht-signifikanten Dezimalstellen:
oder