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

pre*_*se6 4 sql t-sql sql-server

如何从以下两个查询中获得不同的结果?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
Run Code Online (Sandbox Code Playgroud)

结果:-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
Run Code Online (Sandbox Code Playgroud)

结果:-5796251.59304654

Gor*_*off 5

当你对很多浮点数进行算术运算时,顺序很重要.一个典型的例子是:

1,000,000,000,000,000,000,000,000,000 + -1,000,000,000,000,000,000,000,000,000 + 38
Run Code Online (Sandbox Code Playgroud)

如果评估为:

(1,000,000,000,000,000,000,000,000,000 + -1,000,000,000,000,000,000,000,000,000) + 38
Run Code Online (Sandbox Code Playgroud)

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

如果评估时间如下:

1,000,000,000,000,000,000,000,000,000 + (-1,000,000,000,000,000,000,000,000,000 + 38)
Run Code Online (Sandbox Code Playgroud)

你会得到0.

我建议您使用decimals进行计算.