SQL Server - ошибка при обновлении поля INT значением FLOAT. Изменение значения - PullRequest
0 голосов
/ 17 мая 2018

У меня проблема при обновлении целочисленной переменной со значением с плавающей запятой.При обновлении значение «100» меняется на «99».

DECLARE @intResultado INTEGER=NULL
DECLARE @dblResultado FLOAT=NULL
DECLARE @dblValorMercado FLOAT =15700123654.8047
DECLARE @intCambioTasaInteres INTEGER=100

SET @intResultado=SUM(@dblValorMercado * @intCambioTasaInteres) / SUM(CASE WHEN @dblValorMercado = 0 THEN NULL ELSE @dblValorMercado END)
SET @dblResultado=SUM(@dblValorMercado * @intCambioTasaInteres) / SUM(CASE WHEN @dblValorMercado = 0 THEN NULL ELSE @dblValorMercado END)

SELECT '1. Operation result =' AS [Result], SUM(@dblValorMercado * @intCambioTasaInteres) / SUM(CASE WHEN @dblValorMercado = 0 THEN NULL ELSE @dblValorMercado END) AS [Operation], 'GOOD' AS EVAL
UNION
SELECT '2. Integer operation result  =',@intResultado, 'BAD'
UNION
SELECT '3. Float operation result = ',@dblResultado, 'GOOD'

Это результат:

Result                         Operation              EVAL
------------------------------ ---------------------- ----
1. Original operation result = 100                    GOOD
2. Integer operation result  = 99                     BAD
3. Float operation result =    100                    GOOD

(3 row(s) affected)

Произведенный расчет представляет собой «сумму средневзвешенных значений»,который в этом случае соответствует только 1 значению (в данном случае 100), но это может быть n значений, которые будут использоваться для выполнения суммы взвешенных средних.

Проблема может быть решена путем изменения переменной INTк переменной FLOAT, но это не идея.Но чтобы выяснить, почему значение 100 во время обновления становится значением 99 и как это сделать, чтобы правильное значение 100 обновлялось с помощью переменной INT.

Спасибо

1 Ответ

0 голосов
/ 17 мая 2018

Я подозреваю, что движок SQL пытается выполнить приведение до завершения арифметики. См. https://www.red -gate.com / simple-talk / sql / t-sql-программирования / как-получить-sql-сервер-преобразование данных-ужасно неправильно / раздел 3: Предполагая все числа созданы равными

Обратите внимание, что когда он присваивает DECIMAL переменной INT, это значение FLOOR.

Эти два утверждения также приводят к 99:

SELECT CONVERT( INT, (@dblValorMercado * @intCambioTasaInteres) / @dblValorMercado )
SELECT FLOOR( (@dblValorMercado * @intCambioTasaInteres) / @dblValorMercado )

В то время как, как вы указали, следующее выдает 100:

SELECT (@dblValorMercado * @intCambioTasaInteres) / @dblValorMercado

В C # есть похожие проблемы с преобразованием float в int. (https://answers.unity.com/questions/701483/float-to-int-conversion-using-int-gives-wrong-answ.html)

...