SQL Server舍入错误,给出不同的值

前端之家收集整理的这篇文章主要介绍了SQL Server舍入错误,给出不同的值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个存储过程,它执行大量计算,将结果存储在几个临时表中.
最后计算总和并舍入到两位小数并存储在临时表中并选择它.

对于所关注的列,所有中间和最终临时表都具有数据类型float.

原始场景:

Declare @Intermediate table
{
 --several other columns

Labor float

--several other columns
};

---Lots of calculation ---xx-----

Declare @Final table
{
 --several other columns

LaborTotal float

--several other columns
};

INSERT INTO @Final  SELECT ROUND(ISNULL((SELECT SUM([Labor]) FROM @Intermediate ),0),2)  AS LaborTotal;

SELECT * FROM @Final;

Result: 7585.22  --> when rounded  //Here is the error Expecting 7585.23
        7585.225 --> when not rounded

测试用例 :

DECLARE @test float = 7585.225;
   SELECT ROUND(@test,2) AS Result; --> results 7585.23

   SELECT ROUND(7585.225,2) AS Result --> results 7585.23

将单个值插入临时表,然后计算总和

DECLARE @TmpTable table
(
 MaterialAmount float,LaborAmount float
);

INSERT INTO @TmpTable VALUES (12.10,1218.75);
INSERT INTO @TmpTable VALUES (12.10,1090.125);
INSERT INTO @TmpTable VALUES (12.10,900);
INSERT INTO @TmpTable VALUES (12.10,1632.6);
INSERT INTO @TmpTable VALUES (12.10,1625);
INSERT INTO @TmpTable VALUES (12.10,1118.75);


SELECT ROUND(ISNULL((SELECT SUM(MaterialAmount) FROM @TmpTable),2) AS MatSum,ISNULL((SELECT SUM(LaborAmount) FROM @TmpTable),0) AS LabSumUnrounded,--> 7585.225
       ROUND(ISNULL((SELECT SUM(LaborAmount) FROM @TmpTable),2) AS LabSum;  --> 7585.23

SELECT ROUND(SUM(MaterialAmount),2),ROUND(SUM(LaborAmount),2)   ---> 7585.23
   FROM @TmpTable;

任何想法/建议为什么我在我的原始场景中获得0.01差异,同时在我的所有测试用例中获得准确的值?
提前致谢.

解决方法

这是因为您使用的是float数据库类型.

Float不应该用于表示需要精度的值,因为它们存储为近似值,不同的操作可以给出不同的结果.

sql Server中,您可以使用十进制和数字数据类型进行数值精度:
http://msdn.microsoft.com/en-us/library/ms187746.aspx

猜你在找的MsSQL相关文章