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