Wir sind mit einer Datenbank fest, die (leider) Gleitkommazahlen anstelle von Dezimalwerten verwendet. Das macht das Runden etwas schwierig. Betrachten Sie das folgende Beispiel (SQL Server T-SQL):"Runde halb hoch" auf Gleitkommawerten
SELECT ROUND(6.925e0, 2) --> returns 6.92
ROUND
tut round half up, aber da floating point numbers cannot accurately represent decimal numbers, das "falsche" Ergebnis (aus der Sicht des Endbenutzers) angezeigt. Ich verstehe warum das passiert.
Ich kam bereits mit zwei möglichen Lösungen nach oben (beide einen Schwimmer zurückkehrt, das ist leider auch eine Anforderung):
- in eine Dezimalzahl Datentyp konvertieren vor dem Runden:
SELECT CONVERT(float, ROUND(CONVERT(decimal(29,14), 6.925e0), 2))
- Multiply bis die dritte Stelle befindet sich auf der linken Seite des Dezimalpunktes (dh genau dargestellt), und führen Sie dann die Rundung:
SELECT ROUND(6.925e0 * 1000, -1)/1000
Welches sollte ich wählen? Gibt es eine bessere Lösung? (Leider können wir nicht die Feldtypen in der Datenbank ändern aufgrund einiger Legacy-Anwendungen die gleichen DB zugreifen.)
Gibt es eine gut etablierte Best Practice Lösung für dieses (gemeinsam?) Problem?
(Offensichtlich ist die übliche Technik „Runden zweimal“ wird seit 6.925 hier nicht helfen, ist bereits auf drei Dezimalstellen gerundet - soweit dies in einem Schwimmer möglich ist.)
Ich markiert dies sowohl 'sql-server' und' sprach-agnostic', da die Beispiele in T-SQL sind, aber die Frage nach einem Best-Practice-Algorithmus ist ein generischer. – Heinzi
Es gibt keinen Algorithmus oder eine Funktion, die das erreichen kann, was Sie wollen, weil die meisten Gleitkommazahlen, die Vielfache eines Basis-10-Bruchteils sind, nicht genau darstellbar sind. Zum Beispiel wird 6.925 als etwas über oder unter dem Wert dargestellt, aber niemals exakt. Welchen Weg soll es abgerundet werden? – hirschhornsalz