Преобразование SQL FLOAT в SQL INT, потерянные данные - PullRequest
8 голосов
/ 09 декабря 2010

У меня возникли проблемы с преобразованием некоторых данных, хранящихся в типе данных FLOAT, в данные, хранящиеся в типе данных INT.Приведенный ниже пример иллюстрирует мою проблему:

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)

Желаемые результаты будут такими: ID = 1 VALUE = 15662 Однако, если исходить из таблицы @data, я, похоже, не понимаю этого.Я вместо этого получаю ID = 1 VALUE = 15661.

У кого-нибудь есть идеи, почему это так?Я предполагаю, что это какой-то нюанс поплавка.Но я никогда не думал, что это будет иметь проблемы с чем-то вроде выше.Есть идеи?Заранее спасибо за помощь.

Ответы [ 2 ]

16 голосов
/ 09 декабря 2010

Это классическая (int) ((0,1 + 0,7) * 10) проблема. Поскольку числа с плавающей точкой имеют произвольную точность, некоторая потеря данных при приведении к int возможна даже для очень простых случаев.

Вместо этого используйте ROUND(weight * 1000000.0, 0).

0 голосов
/ 09 декабря 2010

Это обычное поведение для типа данных с плавающей точкой из-за специфики данных на компьютерах.Используйте десятичный (числовой) тип данных с фиксированными цифрами после десятичной точки.Например, десятичное число (10, 6).

...