Verkürzen Sie einen Dezimalwert in C ++

7

Was ist der einfachste Weg, um eine C ++ float Variable, die einen Wert von 0.6000002 hat, auf einen Wert von 0.6000 abzuschneiden und in der Variablen?

zu speichern     
BeachRunnerFred 20.11.2008, 00:48
quelle

9 Antworten

5

Zuerst ist es wichtig zu wissen, dass Gleitkommazahlen angenähert sind. Siehe den Link von @Greg Hewgill, um zu verstehen, warum dieses Problem nicht vollständig lösbar ist.

Aber hier sind ein paar Lösungen für das Problem, die wahrscheinlich Ihre Bedürfnisse erfüllen werden:

Wahrscheinlich die bessere Methode, aber weniger effizient:

%Vor%

Der effizientere Weg, aber wahrscheinlich weniger präzise:

%Vor%     
Brian R. Bondy 20.11.2008, 00:49
quelle
12

Eine gute Referenz für warum das passiert, finden Sie in Was jeder Computer Wissenschaftler sollten über Gleitkommaarithmetik Bescheid wissen von David Goldberg.

    
Greg Hewgill 20.11.2008 00:57
quelle
6

Realistisch ist das nicht möglich. Es ist keine C ++ - Einschränkung, sondern genau so, wie Gleitkomma funktioniert. Für viele Werte gibt es keine präzisen Darstellungen, so dass Sie nicht einfach auf eine Anzahl von Ziffern abschneiden können.

Sie können beim Drucken mit PrintF-Formatzeichenfolgen abgeschnitten werden.

Wenn Sie wirklich nur eine begrenzte Anzahl von Ziffern speichern können, sollten Sie stattdessen einen Datentyp mit fester Genauigkeit verwenden.

    
Kamil Kisiel 20.11.2008 00:53
quelle
3

Ich denke, die Frage, die hier gestellt werden sollte, ist: Warum brauchen Sie es abgeschnitten?

Wenn es für den Vergleich zwischen Werten ist, sollten Sie vielleicht den Epsilon-Test in Erwägung ziehen. (mit einem zusätzlichen Toleranzwert, in Ihrem Fall, da es viel größer scheint als das allgemein akzeptierte Epsilon).

Wenn Sie es nur als 0.6000 ausdrucken möchten, verwenden Sie die von anderen vorgeschlagenen Methoden.

    
Alex Lim 20.11.2008 02:07
quelle
1
%Vor%

In Ihrem Fall werden beispielsweise drei Ziffern abgeschnitten (numDigits). Sie würden verwenden:

%Vor%

(Sie würden wahrscheinlich das Ergebnis von powf irgendwo speichern, da Sie es zweimal benutzen.)

Da Floats normalerweise auf Computern gespeichert werden, sind wahrscheinlich Ungenauigkeiten vorhanden. Das ist es, was man für die Verwendung von Floats bekommt.

    
strager 23.11.2008 02:13
quelle
1

Verwenden Sie dies:

%Vor%     
JBOI 07.02.2010 04:21
quelle
0

Hier ist eine Funktion, die den Hinweis in anderen Antworten und ein Anwendungsbeispiel verwendet:

%Vor%     
David Doria 14.03.2013 16:33
quelle
0

Ähnlich wie bei anderen Antworten, ABER Sie dürfen nicht vergessen, dass die Begriffe "rund", "floor" und "trunc" per Definition unterschiedlich sind. Siehe das Definitions- und Ausgabebeispiel für Folgendes:

Ссылка

In diesem Fall müssen wir mit einer Genauigkeit von 4 Dezimalstellen arbeiten und nicht signifikante Dezimalstellen entfernen:

%Vor%

oder

%Vor%     
Rubarb 20.01.2016 18:58
quelle
0

Für C ++ 11 können Sie std::round verwenden, das im Header <cmath> :

definiert ist %Vor%     
chema989 28.04.2017 19:04
quelle

Tags und Links