Verwenden IEEE-754 Floating-Zahlen nicht (single
, float
, double
) für dezimale Berechnungen, bei denen alle Stellen gleichermaßen von Bedeutung sind (soweit geschäfts Regeln betroffen sind). Dies liegt daran, dass IEEE-754 Rundungsfehler aufweist und einige triviale Dezimalzahlen nicht genau darstellen kann. Es ist wirklich für wissenschaftliche und technische Anwendungen gedacht, bei denen geringe Informationsverluste akzeptabel sind.
Wenn es sich um Dezimalzahlen mit fester Genauigkeit handelt (z. B. Währungswerte), empfiehlt es sich, vorgemischte Ganzzahlen zu verwenden, sodass 100
(für 100 Cent) 1
Dollar darstellt.
Wenn du gehst scanf
zu verwenden, empfehle ich folgendes:
int dollars = 0, cents = 0;
bool done = false;
while(!done) {
done = scanf("%4d.%2d", &dollars, ¢s) != 2
}
cents += dollars * 100;
Hinweis meine Verwendung der maximalen Länge Bezeich (4
und 2
jeweils) einen Puffer-Überlauf in scanf
zu verhindern.
Nein, aus dem üblichen Grund. 50.21 ist nicht genau darstellbar. Vielleicht können Sie Festkommaarithmetik verwenden? – harold
Ich nehme an, Sie meinten 'scanf ("% f ", &bill);', mit dem Adressenoperator? Oder ist 'bill' ein Zeiger? –
Sie wissen, wie' 1/3' als Dezimalzahl mit einem Punkt dargestellt ist 0,333. .. 'geht für immer weiter? Nun,' 1/10', dargestellt als binär mit einem Punkt, macht dasselbe - wie '1/100' Dies ist ein Problem, wenn Werte, die als exakte Dezimalzahlen dargestellt werden, in binäre Fließkommawerte umgewandelt werden sind spezielle Fälle, in denen es funktioniert (ganze Zahlen, Vielfache von 0,5 oder 0,25 oder 0,125 usw.), aber im Allgemeinen kann es nicht gemacht werden, Sie müssen die nächste Annäherung akzeptieren, die zu der binären Gleitkommadarstellung passt used. – Steve314