Почему функция SQL SUM() возвращает ненулевое значение, когда сумма чисел с плавающей запятой должна равняться 0?

Я столкнулся с этой проблемой с функцией 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.

Тип данных для столбца Qty — float

Masood Subhani 20.12.2020 23:35

Для всех практических целей -3.5527136788005E-15 равно нулю.

Gordon Linoff 20.12.2020 23:44

Я бы предложил использовать функцию ROUND, чтобы обрезать эти дополнительные цифры, что для типа float может привести к этим странным результатам 0.0xxxxE-16.

Fabio Mendes Soares 21.12.2020 01:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
739
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете тип данных 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;

Возвращает:

Плавающая сумма Преобразованная сумма -3,5527136788005Э-15 0,00

Другие вопросы по теме