相同的数学逻辑,不同的结果?

时间:2017-02-01 16:43:43

标签: sql sql-server tsql

如何从以下两个查询中获得不同的结果? a,b,c是浮点数,我认为它们会返回相同的结果,但它们稍微偏离。

SELECT (a-b)+(c) 
FROM
    (
            select  sum([Actual Freight Per Line Amt]) a, 
                    sum([fedex charge per line amt]) b, 
                    sum([inbound freight cost]) c 
             from stg.invoices where year([gl date]) = '2016'
    ) foo

结果:-5822899.31314175

&安培;

SELECT SUM((a-b)+(c))
FROM
    (
            select  [Actual Freight Per Line Amt] a, 
                    [fedex charge per line amt] b, 
                    [inbound freight cost] c 
             from stg.invoices where year([gl date]) = '2016'
    ) foo

结果:-5796251.59304654

3 个答案:

答案 0 :(得分:5)

当您对许多浮点数进行算术运算时,排序很重要。一个典型的例子是:

1,000,000,000,000,000,000,000,000,000 + -1,000,000,000,000,000,000,000,000,000 + 38

如果评估为:

(1,000,000,000,000,000,000,000,000,000 + -1,000,000,000,000,000,000,000,000,000) + 38

你会得到38.“38”比其他数字小得多,浮点表示不能代表该值。

如果在以下位置进行评估:

1,000,000,000,000,000,000,000,000,000 + (-1,000,000,000,000,000,000,000,000,000 + 38)

你会得到0。

我建议您使用decimal进行计算。

答案 1 :(得分:2)

您的任何值是否为NULL?

说,您有以下数据:

a        b        c
NULL     1        2
1        2        3

您的第一个查询将提供3的结果。

您的第二个查询将提供2的结果。

答案 2 :(得分:1)

欢迎来到花车世界 它不是大数字或小数字 这是关于这个数字的准确性限制'代表方法。

declare @t table (f float);
insert into @t(f) values (0.1),(0.2),(-0.2),(-0.1);
select sum(f) from @t;
  

2.77555756156289E-17

declare @t table (f float);
insert into @t(f) values (0.1),(0.2),(-0.3);
select sum(f) from @t;
  

5.55111512312578E-17