Drücke „Enter”, um zum Inhalt zu springen.

Murphy schlägt zu

Jan 0

heute morgenErstmal grimmig gucken… Am Wochenende wurde mir witzelnd die Frage gestellt, wann denn mal eine neue Ausgabe von „Besser programmieren für die Welt von morgen!“ erscheint. Ziemlich sicher antwortete ich darauf, dass ich doch nun mittlerweile alle Bugs beseitigt hab und es wohl keine weiteren Ausgaben geben wird. Naja klar, solange bis man das nächste Mal auf Arbeit geht – Danke, Herr Murphy.

Kurze Schilderung des Problems: Ich muss einen Betrag aufteilen und durch interne Berechnungen und Rundungen kommt es zu einem Differenzbetrag zwischen dem aufzuteilenden Betrag und der Summe der Einzelbeträge. Und nun stolperte ich beim Durchsehen der Tests, dass statt einem Cent eine Differenz von 0 Cent ausgegeben wird. Ich schob die Schuld natürlich wieder auf die Konvertierungsroutine, denn eine fix reinprogrammierte Ausgabe zeigte mir auch einen Betrag von einem Cent an. Merkwürdigerweise konnte ich dort keinen Fehler finden. Gaukelt mir etwa der Rechner was vor? War die Differenz von einem Cent auch wirklich ein Cent? Also zog ich von dem Betrag den Wert von 0.01 ab und ließ mir das Ergebnis ausgeben. Vermutung war vollkommen korrekt, denn die 0.01 war in Wirklichkeit eine 0.009999999999998. Und damit rutschte sie in dieser Routine an der Rundung der Nachkommastellen vorbei.

1
2
3
4
5
6
7
8
9
10
if (0.01 > value && -0.01 < value);
else
{
  value = ((0.0<(value*100.0))?(value*100.0+0.5):(value*100.0-0.5))/100.0;
  // unterschiedliche Behandlung der Nachkommastellen
  if (0.0 < (value*100.0))
    nachkomma = ((long)((value-floor(value))*100.0))%100;
  else
    nachkomma = ((long)((value-ceil(value))*100.0))%100;
}

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.