当我输入以下查询时使用 SQL Server 2008 R2:
SELECT CAST(POWER(2.0, 63.0) AS BIGINT);
这会产生结果:
9223372036854775800
但是,使用 Windows 桌面计算器将 2 加到 63 的结果是:
9223372036854775807
有人可以解释一下其中的区别吗——或者 SQL Server 是否正在进行一些内部转换? ...或者我还缺少其他东西吗?
最佳答案
MS Sql Server 中BIGINT
的范围是:
-2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807)
计算器给出的数字是错误的,因为 2^63 最右边的数字不可能是奇数。
SQL Server 中的 POWER 函数 ( http://technet.microsoft.com/en-us/library/ms174276.aspx ) 返回与其第一个参数相同的类型。
编写此查询的正确方法是:
DECLARE @foo REAL = 2.0
SELECT CAST(POWER( @foo, 63.0 ) AS BIGINT)
这样,您将收到 将表达式转换为数据类型 bigint 时出现算术溢出错误。
错误消息。
关于原因
http://www.extremeoptimization.com/resources/Articles/FPDotNetConceptsAndFormats.aspx
关于为什么 POWER
函数返回错误数字的问题?正如 @simonatrcl 在他的回答中提到的, float 存在算术问题,有时会导致无效结果。您可以在此处阅读有关 float 及其问题的信息:
http://www.extremeoptimization.com/resources/Articles/FPDotNetConceptsAndFormats.aspx
您还可以在此处检查 MS Sql Server 中整数类型的边界: http://technet.microsoft.com/en-us/library/ms187745.aspx
关于SQL Server POWER 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20937242/