sql-server - SQL Server 中浮点计算的结果不一致
问题描述
我有一个在 Linux 上的 SQL Server 2017 上运行的 ETL 进程。
该过程有一些浮点计算,我注意到在同一过程的两次不同运行中,我得到的结果略有不同。一次运行给了我类似 1.23450000...1 的结果,另一次给了我 1.23459999...两者都是精确值 1.2345 的近似值。差异在 10e-15 左右。
我知道如果我关心两个数字完全相等,我不应该首先使用浮点数。我可以接受任何一个结果都是正确的,因为两者都在“正确”答案的某个小ε范围内。
所以我真正的问题更多是对近似值本身的变化的好奇。我是否必须假设 SQL Server 中浮点结果的二进制表示可能每次都不完全相同?有什么原因可以得到不同的结果,例如 SUM 以不同的顺序迭代行,或者不同的查询计划产生不同的表示?如果是这种情况,假设您可以比较浮点是否完全相等是绝对不安全的,即使它是当前运行的结果与上次运行的结果。
解决方案
SUM
与并行度/ maxdop > 1 相比,可能是罪魁祸首。
对浮点数的单个加法操作是确定性的,但加法不是关联的,因此SUM
如果以不同的顺序处理行,a 可能不会产生一致的结果。这个另一个问题很好地总结了它:
推荐阅读
- python - search and extract data from string base on string value
- typescript - 如何使用新的 elasticsearch typescript 类型
- php - Wordpress comments.PHP 在隐身模式下显示缓存版本,但登录管理员的新版本
- php - DataTables + PHP/AJAX - 在显示之前操作结果
- python - 当我尝试发送消息时,RabbitMQ 崩溃
- python - QImage 在干涉图案上输出失真图像
- ssas - 使用 AMO 创建 Analysis Services 数据库的精确副本
- python - 张量流中的3D矩阵乘法:AAB和AAB矩阵得到一个新的AAB矩阵
- keycloak - 无法从 Keycloak 中发送电子邮件
- flutter - 如何将 json 列表传递给 Flutter 中的 http Post 请求正文?