设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2021-02-24 11:36 所属栏目:116 来源:网络整理
导读:我有一个存储过程,它执行大量计算,将结果存储在几个临时表中. 最后计算总和并舍入到两位小数并存储在临时表中并选择它. 对于所关注的列,所有中间和最终临时表都具有数据类型float. 原始场景: Declare @Intermediate table{ --several other columnsLabor flo

我有一个存储过程,它执行大量计算,将结果存储在几个临时表中.
最后计算总和并舍入到两位小数并存储在临时表中并选择它.

对于所关注的列,所有中间和最终临时表都具有数据类型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

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读