我如何知道decimal
类型的最大值?
例如:
decimal(5, 2)
您能解释一下decimal
类型的机制吗?
答案 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.99
。 5
是小数点左侧和右侧的小数位总数。 2
是小数点右边的小数位数。
小数的最大可能范围是-10 ^ 38 + 1到10 ^ 38 - 1.
答案 2 :(得分:1)
我想强调在使用NUMERIC / DECIMAL值时可能会出现一个问题。如果NUMERIC_ROUNDABORT
和ARITHABORT
为ON
且新值范围更高,则会生成异常/错误。
备注当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)