对行求和然后计算公式 vs 逐行计算公式然后求和
Sum rows and then calculate formula vs calculate formula row by row and then sum
我有一道愚蠢的数学题。在 T-SQL
中,为什么这两个总和不同:
select (34.3+17.5 + 13.5)/31.0*28.0 --= 58.9806280
select 34.3/31.0*28.0 + 17.5/31.0*28.0 + 13.5/31.0*28.0 --= 58.9806000
根据运算符优先级规则和您的号码类型进行计算。
第一个 select (34.3+17.5 + 13.5)/31.0*28.0
分 3 步完成:
select (34.3 + 17.5 + 13.5) -- = 65.3
select 65.3 / 31.0 -- = 2.106451
select 2.106451 * 28.0 -- = 58.9806280
第二个是这样做的:
- 划分优先级:
select 34.3 / 31.0 -- = 1.106451
select 17.5 / 31.0 -- = 0.564516
select 13.5 / 31.0 -- = 0.435483
- 然后:
select 1.106451 * 28.0 -- = 30.9806280
select 0.564516 * 28.0 -- = 15.8064480
select 0.435483 * 28.0 -- = 12.1935240
- 最后:
select 30.9806280 + 15.8064480 + 12.1935240 -- = 58.9806000
如果你更深入,也可以看看这个:
select cast(34.3 as float)/31.0*28.0 + 17.5/31.0*28.0 + 13.5/31.0*28.0
-- => 58,9806451332903
我的英语不太好,其他人已经指出了您的要求,所以如果您想知道为什么数字会这样四舍五入,有 2 个很棒的链接可以帮助您: and https://msdn.microsoft.com/en-us/library/ms190476(SQL.90).aspx
我有一道愚蠢的数学题。在 T-SQL
中,为什么这两个总和不同:
select (34.3+17.5 + 13.5)/31.0*28.0 --= 58.9806280
select 34.3/31.0*28.0 + 17.5/31.0*28.0 + 13.5/31.0*28.0 --= 58.9806000
根据运算符优先级规则和您的号码类型进行计算。
第一个 select (34.3+17.5 + 13.5)/31.0*28.0
分 3 步完成:
select (34.3 + 17.5 + 13.5) -- = 65.3
select 65.3 / 31.0 -- = 2.106451
select 2.106451 * 28.0 -- = 58.9806280
第二个是这样做的:
- 划分优先级:
select 34.3 / 31.0 -- = 1.106451 select 17.5 / 31.0 -- = 0.564516 select 13.5 / 31.0 -- = 0.435483
- 然后:
select 1.106451 * 28.0 -- = 30.9806280 select 0.564516 * 28.0 -- = 15.8064480 select 0.435483 * 28.0 -- = 12.1935240
- 最后:
select 30.9806280 + 15.8064480 + 12.1935240 -- = 58.9806000
如果你更深入,也可以看看这个:
select cast(34.3 as float)/31.0*28.0 + 17.5/31.0*28.0 + 13.5/31.0*28.0
-- => 58,9806451332903
我的英语不太好,其他人已经指出了您的要求,所以如果您想知道为什么数字会这样四舍五入,有 2 个很棒的链接可以帮助您: and https://msdn.microsoft.com/en-us/library/ms190476(SQL.90).aspx