Vor einiger Zeit hatte ich einen Thread geöffnet und eine Frage bzgl.
der Anzeige von Doubles auf einem Display gestellt. Dies sah in etwa so
aus:
1 | double amount1 = 0;
|
2 | double amount2 = 0;
|
3 | double amount3 = 0;
|
4 | unsigned char anzahl1 = 3;
|
5 | unsigned char anzahl2 = 4;
|
6 | unsigned char anzahl3 = 54;
|
7 | amount1 = anzahl1*(double)0.01;
|
8 | amount2 = anzahl2*(double)0.02;
|
9 | amount3 = anzahl3*(double)0.05;
|
10 | double_to_Display(amount1);
|
11 | double_to_Display(amount2);
|
12 | double_to_Display(amount3);
|
Da der uc rundet und z.b. 0.01 in Wirkilichkeit 0.0999999999; 0.02 =
0.19999 etc. ist kam es bei der Rechenoperation stets zu falschen
Anzeigen auf dem Display.
Herr Miller hat den folgenden Tip für die anzeige gegeben, der für die
Anzeige auch funktioniert hat:
1 | amount1 = anzahl1*(double)0.01 + 0.005;
|
2 | amount2 = anzahl2*(double)0.02 + 0.005;
|
3 | amount3 = anzahl3*(double)0.05+ 0.005;
|
4 | double_to_Display(amount1);
|
5 | double_to_Display(amount2);
|
6 | double_to_Display(amount3);
|
Jetzt kommt jedoch ein weiteres Problem auf, wenn ich wieder mit diesen
Beträgen rechnen will, beispielsweise...
1 | amount1 = anzahl1*(double)0.01 + 0.005;
|
2 | amount2 = anzahl2*(double)0.02 + 0.005;
|
3 | amount3 = anzahl3*(double)0.05+ 0.005;
|
4 | double_to_Display(amount1 + amount2 + amount3);
|
5 | // oder
|
6 | double_to_Display(amount1 -2*5);
|
führt wieder zu einer falschen Anzeige!
Welcher Weg bietet sich an um diese Rundungsproblematik bei double
Werten zu umgehen?
Danke