如何计算SQL Server中的十进制(x,y)最大值

时间:2016-05-30 15:53:40

标签: sql sql-server

我如何知道decimal类型的最大值?

例如:

decimal(5, 2)

您能解释一下decimal类型的机制吗?

3 个答案:

答案 0 :(得分:3)

最大可能值可以使用以下数学公式计算:

(10 ^(x-y))-(10 ^ -y)

所以在您的最初示例中

(10 ^(5-2))-(10 ^ -2)= 1000-0.01 = 999.99

我正在添加此答案,因为我的Google结果试图提醒自己如何计算进入SQL(28,10)十进制字段的C#十进制的SQL友好上限时,我在这里看到了我的google结果。 999999999999999999.9999999999 btw

答案 1 :(得分:2)

您可以使用聚合函数来获取列中的最大值

SELECT MAX(myColumn) AS MyColumnMax
FROM myTable

如果您想知道客户的最大价值,您可以按此客户进行分组

SELECT CustomerID, MAX(OrderAmount) AS MaxOrderAmount
FROM CustomerOrders
GROUP BY CustomerID

您可以找到其他aggregate functions here

相反,如果您对十进制类型的范围感兴趣,那么请考虑您声明的总位数和小数。因此,当所有这些数字为9时,达到最大数量。

因此,对于decimal(5,2),它将是999.995是小数点左侧和右侧的小数位总数。 2是小数点右边的小数位数。

小数的最大可能范围是-10 ^ 38 + 1到10 ^ 38 - 1.

答案 2 :(得分:1)

我想强调在使用NUMERIC / DECIMAL值时可能会出现一个问题。如果NUMERIC_ROUNDABORTARITHABORTON新值范围更高,则会生成异常/错误。

  

备注当SET NUMERIC_ROUNDABORT为ON时,之后会产生错误   表达式中出现精度损失。当OFF,损失   precision不生成错误消息,结果舍入到   存储结果的列或变量的精度。 [...]如果   SET NUMERIC_ROUNDABORT为ON,SET ARITHABORT确定严重性   生成的错误。

参考:MSDN

SET NUMERIC_ROUNDABORT ON
SET ARITHABORT ON
GO
DECLARE @a DECIMAL(5, 2) 
SET @a = .115
SELECT @a  AS [Values when all SET are ON]
GO

SET NUMERIC_ROUNDABORT OFF
SET ARITHABORT OFF
GO
DECLARE @a NUMERIC(5, 2) 
SET @a = .115
SELECT @a AS [Values when all SET are OFF]
GO

SET NUMERIC_ROUNDABORT OFF
SET ARITHABORT ON
GO
DECLARE @a NUMERIC(5, 2) 
SET @a = .115
SELECT @a AS [Values when SET is ON/OFF]

结果:

Msg 8115, Level 16, State 7, Line 5
Arithmetic overflow error converting numeric to data type numeric.
Values when all SET are ON
---------------------------------------
NULL

(1 row(s) affected)

Values when all SET are OFF
---------------------------------------
0.12

(1 row(s) affected)

Values when SET is ON/OFF
---------------------------------------
0.12

(1 row(s) affected)