这是一篇很棒的文章,描述了何时使用浮点数和小数。浮点数存储一个近似值,十进制数存储一个精确值。
总之,精确值(如货币)应使用小数,而近似值(如科学测量)应使用浮点。
这是一个有趣的示例,表明浮点数和十进制数均会丢失精度。当添加非整数的数字然后减去相同的数字时,float会导致精度下降,而十进制则不会:
DECLARE @Float1 float, @Float2 float, @Float3 float, @Float4 float;
SET @Float1 = 54;
SET @Float2 = 3.1;
SET @Float3 = 0 + @Float1 + @Float2;
SELECT @Float3 - @Float1 - @Float2 AS "Should be 0";
Should be 0
----------------------
1.13797860024079E-15
当将一个非整数乘以该数字后,小数会丢失精度,而浮点数则不会。
DECLARE @Fixed1 decimal(8,4), @Fixed2 decimal(8,4), @Fixed3 decimal(8,4);
SET @Fixed1 = 54;
SET @Fixed2 = 0.03;
SET @Fixed3 = 1 * @Fixed1 / @Fixed2;
SELECT @Fixed3 / @Fixed1 * @Fixed2 AS "Should be 1";
Should be 1
---------------------------------------
0.99999999999999900