3

我正在使用 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说它返回一个浮点数。所以我猜这一定是一个四舍五入的问题,但我无法找到解决方案。

4

1 回答 1

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.

你可以在这里阅读。

于 2012-01-17T09:31:31.390 回答