如何使power()函数使用十进制而不是整数?

时间:2014-05-23 13:08:14

标签: sql-server

以下查询引发错误:

SELECT POWER( 10, 13)

错误讯息:

Msg 232, Level 16, State 3, Line 1
Arithmetic overflow error for type int, value = 10000000000.000000.

我可以做什么来阻止int溢出?

3 个答案:

答案 0 :(得分:3)

添加小数位:

SELECT POWER( 10.0, 11 - LEN(9)) - 1

这导致从int到DECIMAL(18,6)的隐式转换。你可以把它写成相同的结果:

SELECT POWER(CAST(10 as DECIMAL(18,6)), 11 - LEN(9)) - 1

POWER函数返回类型记录为:

  

返回与float_expression中提交的类型相同的类型。例如,   如果将十进制(2,0)作为float_expression提交,则为结果   返回的是十进制(2,0)

这意味着您的结果是DECIMAL(18,6),在您的情况下,该结果足以保留最终结果。

答案 1 :(得分:2)

使用以下

SELECT POWER( 10.0, 11 - LEN(9)) - 1

<强>解释

当计算产生的结果超出min&amp;时,会发生算术溢出。数据类型可以存储的最大值。在您的情况下,POWER( 10, 11 - LEN(9))生成10000000000,并且数据类型隐式实现为int。该值大于int可以采用的最大值,即2147483647,从而产生溢出。如果将POWER( 10.0, 11 - LEN(9))与10.0一起使用,则计算将生成十进制,因为十进制在SQL Server中的优先级高于int。十进制的范围为- 10^38 +1 through 10^38 - 1,因此不会为您的计算创建溢出。

答案 2 :(得分:1)

您可以使用CONVERT

SELECT CONVERT(DECIMAL(18,2), 10)

这指定2个小数位,但您可以修改括号(18,5)中的数字以根据需要调整此precision & scale