首页 > 解决方案 > SQL Server 中浮点计算的结果不一致

问题描述

我有一个在 Linux 上的 SQL Server 2017 上运行的 ETL 进程。

该过程有一些浮点计算,我注意到在同一过程的两次不同运行中,我得到的结果略有不同。一次运行给了我类似 1.23450000...1 的结果,另一次给了我 1.23459999...两者都是精确值 1.2345 的近似值。差异在 10e-15 左右。

我知道如果我关心两个数字完全相等,我不应该首先使用浮点数。我可以接受任何一个结果都是正确的,因为两者都在“正确”答案的某个小ε范围内。

所以我真正的问题更多是对近似值本身的变化的好奇。我是否必须假设 SQL Server 中浮点结果的二进制表示可能每次都不完全相同?有什么原因可以得到不同的结果,例如 SUM 以不同的顺序迭代行,或者不同的查询计划产生不同的表示?如果是这种情况,假设您可以比较浮点是否完全相等是绝对不安全的,即使它是当前运行的结果与上次运行的结果。

标签: sql-serverfloating-point

解决方案


SUM与并行度/ maxdop > 1 相比,可能是罪魁祸首。

对浮点数的单个加法操作是确定性的,但加法不是关联的,因此SUM如果以不同的顺序处理行,a 可能不会产生一致的结果。这个另一个问题很好地总结了它:


推荐阅读