2012-01-17 2 views
2

Я использую SQL Server 2008, одним из моих требований является вычисление стандартного отклонения населения. SQL Server предоставляет встроенную функцию stdevp. Я использую его, но меня пугает результат, который я получаю. Стандартное отклонение населения для группы одинаковых чисел должно быть равным нулю, но здесь я получаю немного отличающееся, хотя и незначительное значение.Встроенная функция SQL Server Ошибка вычисления Stdevp

drop table guest.tempTable; 

create table guest.tempTable (column1 varchar , column2 decimal(10,6)) 

insert into guest.tempTable values('a',3578.2700); 
insert into guest.tempTable values('a',3578.2700); 
insert into guest.tempTable values('a',3578.2700);   
insert into guest.tempTable values('a',3578.2700); 

insert into guest.tempTable values('a',3578.2700); 
commit; 

Ниже приводится STDEVP запрос:

select stdevp(column2) from guest.tempTable 
group by column1 

В результате я получаю

------------------------ 
5.459150335692846E-5 

, который должен был 0,00.

В документации для stdevp указано, что он возвращает поплавок. Поэтому я предполагаю, что это вопрос округления, но я не могу найти решение.

ответ

1

Номера с плавающей точкой не на 100% точны.

Того факт, что числа с плавающей точкой не могут точно представлять все действительных чисел, и операции с плавающей запятой не могут точно представляют собой истинные арифметические операции, приводит ко многим удивительным ситуаций. Это связано с конечной точностью, с которой компьютеры обычно представляют числа.

Например, не представимость 0,1 и 0,01 (в двоичном формате) означает, что результат попытки квадрата 0,1 не является ни 0.01, ни представимым числом, ближайшим к нему. В 24-битной (одинарной точности) представление, 0,1 (десятичное) было дано ранее как e = -4; s = 110011001100110011001101, который

0.100000001490116119384765625 exactly. 

Возводя это число дает

0.010000000298023226097399174250313080847263336181640625 exactly. 

Возводя его с одинарной точностью с плавающей запятой аппаратных средств (с округления) дает

0.010000000707805156707763671875 exactly. 

Но представляющее число, самое близкое к 0,01, составляет

0.009999999776482582092285156250 exactly. 

Вы можете прочитать об этом HERE.

+0

Спасибо за ответ, да, это вопрос округления, но я надеялся, что если бы было какое-либо решение, которое было бы известно, что бы получить правильный результат, например, если я изменю точность указанного поля (или самого типа данных) но я думаю, что все равно будет проходить одна и та же арифметика с плавающей запятой :( – rirhs

+1

Одним из возможных решений может быть сделать это без float. Используйте десятичное или числовое значение. –

+0

Я пытался использовать другие типы данных, но без успеха, теперь я полагаясь на вычисление stdev на прикладном уровне вместо вычисления его в слое базы данных, тогда я округляю его до приемлемого предела.Как-то stdev в java дает сравнительно точные результаты (хотя они еще не будут 0) по сравнению с SQLServer, поэтому я беру этот подход. – rirhs

Смежные вопросы