Never ever, ever use float!

Heute habe ich einen sehr komischen Fehler bzw. ein sehr komisches Rundungsverhalten im SQL-Server entdeckt. Das wollte ich an dieser Stelle einfach mal loswerden. Ich hab das Problem auch zu Microsoft eskaliert und werde den Artikel hier weiterschreiben, wenn ich dort Antworten bzw. Klarheit erzielen konnte. Also: in einem Kundenprojekt laden wir Daten aus einem SharePoint-Server, reichern diese mit berechneten Daten aus einem SQL-Server (SAP-Datawarehouse) an und schreiben die Daten dann in den SharePoint Server zurück. Eigentlich ein ziemlich einfaches Szenario. Bei den Daten handelt es sich um Geldbeträge, also klassischerweise Fließkommazahlen mit zwei Nachkommastellen. Diese Geldwerte werden über den Monat aggregiert. Außerdem wird dann noch eine Summe der aufgelaufenen Kosten ermittelt (also Jan + Feb + Mrz + Apr + Mai + Jun + Jul + Aug + Sep + Okt + Nov + Dez). Das habe ich dann auch mal so implementiert. Als Datentyp habe ich float verwendet:

011914_2252_Nevereverev1

Wichtig ist die Berechnung von Ist_x0020_Aufgelaufen. Hier wird einfach nur die Summe der Monatssummen gebildet. Über die ISNULL-Funktion wird das ganze abgesichert, dass wenn ein der Monatssummen unerwarteterweise NULL sein sollte, der Wert auf 0 gesetzt wird. Nun fragen wir die Ergebnisse mal mit dem folgenden Befehl ab:

011914_2252_Nevereverev2

Als Ergebnis erhalten wir:

011814_1351_Nevereverev1

Interessant ist, dass bei der Berechnung von 145325,54 + 11*0 der Wert 145327 herauskommt. Die in der Abfrage berechnete Summe ist wiederum richtig. Außerdem kann man im Ergebnis sehen, dass dieser Fehler nicht immer vorkommt sondern nur manchmal.Ersetzt man jetzt in der Stored Procedure den Datentyp durch money bei Beibhaltung der Berechnung

011914_2252_Nevereverev3

So wird nun das richtige Ergebnis berechnet.

011814_1351_Nevereverev2

 

Bei Divisionen oder bei Multiplikationen hätte ich das ja unter Umständen noch verstanden. Aber bei einer Addition mit 0 ??? Ich hätte auch nie gedacht, dass Rundungen bei Additionen von Fließkommazahlen mit zwei Nachkommastellen überhaupt ein Thema sein könnte.

Ich bin mal gespannt wie die Erklärung für dieses Verhalten aussieht.

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: