SQL Server内置函数Stdevp计算不正确

时间:2012-01-17 09:22:49

标签: sql-server sql-server-2008 floating-point-precision

我正在使用SQL Server 2008,我的一个要求是计算人口标准差。 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 个答案:

答案 0 :(得分: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