2010-12-09 11 views
8

Ich habe einige Probleme mit der Konvertierung einiger Daten in einem FLOAT-Datentyp in Daten in einem INT-Datentyp gespeichert. Das folgende Beispiel zeigt mein Problem:Converting SQL FLOAT zu SQL INT, verlorene Daten

DECLARE @data TABLE 
(
id INT, 
weight FLOAT 
) 
INSERT INTO @data VALUES(1,0.015662) 

SELECT CAST(weight * 1000000 AS INT) FROM @data 
SELECT 0.015662 * 1000000 
SELECT CAST(0.015662 * 1000000 AS INT) 

Die gewünschten Ergebnisse wären: ID = 1 VALUE = 15662 jedoch, wenn von dem @data Tisch komme, scheine ich nicht, dies zu erhalten. Ich bekomme stattdessen ID = 1 VALUE = 15661.

Hat jemand eine Idee, warum das ist? Ich vermute, es ist eine Art Float Nuance. Aber ich hätte nie gedacht, dass es ein Problem mit etwas wie dem oben genannten hätte. Irgendwelche Ideen? Vielen Dank im Voraus für Ihre Hilfe.

Antwort

16

Dies ist das klassische (int)((0.1+0.7)*10) Problem. Da Floats eine beliebige Genauigkeit haben, ist ein Datenverlust bei der Umwandlung in int selbst für sehr einfache Fälle möglich.

Verwenden Sie stattdessen ROUND(weight * 1000000.0, 0).

+0

ROUND (Gewicht * 1000000.0, 0) wäre besser, weil wir nicht wissen, welcher Systemautor verwendet. – Lex

0

Dies ist ein häufiges Verhalten für Float-Datentyp aufgrund der Spezifität von Float auf Computern. Verwenden Sie den Dezimalzahl-Datentyp mit festen Nachkommastellen. Zum Beispiel, dezimal (10, 6).