SQL Server POWER功能

bdc*_*der 4 sql sql-server bigint sql-server-2008-r2

输入以下查询时使用SQL Server 2008 R2:

SELECT CAST(POWER(2.0, 63.0) AS BIGINT);
Run Code Online (Sandbox Code Playgroud)

结果如下:

9223372036854775800
Run Code Online (Sandbox Code Playgroud)

但是,使用Windows桌面计算器并将2提高到63会产生:

9223372036854775807
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这个区别 - 或者SQL Server正在进行一些内部转换?......或者我错过了别的什么?

man*_*man 7

BIGINTMS Sql Server 的范围是:

-2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807)
Run Code Online (Sandbox Code Playgroud)

而且你的计算器给你错误的数字,因为2 ^ 63的最右边的数字不能有一个奇数.

POWERSQL Server中的函数(http://technet.microsoft.com/en-us/library/ms174276.aspx)返回与其第一个参数相同的类型.

编写此查询的正确方法是:

DECLARE @foo REAL = 2.0
SELECT CAST(POWER( @foo, 63.0 ) AS BIGINT)
Run Code Online (Sandbox Code Playgroud)

通过它,您将收到Arithmetic overflow error converting expression to data type bigint.错误消息.关于http://www.extremeoptimization.com/resources/Articles/FPDotNetConceptsAndFormats.aspx的原因

关于为什么POWER函数返回错误的数字的问题?正如@simonatrcl在他的回答中提到的,浮点数存在算术问题,有时会导致无效结果.您可以在这里阅读浮点数及其问题:

http://www.extremeoptimization.com/resources/Articles/FPDotNetConceptsAndFormats.aspx

您还可以在此处检查MS Sql Server中整数类型的边界:http: //technet.microsoft.com/en-us/library/ms187745.aspx