这是一篇很好的文章,描述了何时使用 float 和 decimal。Float 存储一个近似值,decimal 存储一个精确值。
总之,像金钱这样的精确值应该使用小数,而像科学测量这样的近似值应该使用浮点数。
这是一个有趣的例子,它表明 float 和 decimal 都能够丢失精度。当添加一个不是整数的数字然后减去相同的数字时,浮点数会导致精度丢失,而小数则不会:
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