Я столкнулся с этой проблемой с функцией SQL SUM(). У меня есть три значения, сумма которых равна нулю, как вы можете видеть значения, но с функцией SUM() ответом являются странные значения, как показано.
Select Qty from Stock where ProductCode = '5LINE-15-1-30RU'
Output :
1. 49.72
2. -31.065
3. -18.655
Select SUM(Qty) from Stock where ProductCode = '5LINE-15-1-30RU'
Output :
-3.5527136788005E-15
Результат должен быть 0, но я получил это неудобное значение.
Столбец Qty — это float.
Для всех практических целей -3.5527136788005E-15 равно нулю.
Я бы предложил использовать функцию ROUND, чтобы обрезать эти дополнительные цифры, что для типа float может привести к этим странным результатам 0.0xxxxE-16.
Вы используете тип данных float, который хранит значения как приближения c.f.
Типы данных с приблизительными числами для использования с числовыми данными с плавающей запятой. Данные с плавающей запятой являются приблизительными; поэтому не все значения в диапазоне типов данных могут быть представлены точно.
Для случаев, когда вам нужна точность, например. когда вам нужны десятичные/целые значения, вы должны использовать тип данных decimal/int. Довольно редко вы будете использовать float. Если вы не можете изменить тип данных столбца, вы можете преобразовать его перед суммированием, например.
declare @Test table (Qty float);
insert into @Test (Qty)
values
(49.72),
(-31.065),
(-18.655);
select sum(Qty), sum(convert(money,Qty)) from @Test;
Возвращает:
Тип данных для столбца Qty — float