如何在SQL Server中计算小数(x,y)的最大值

7

如何确定decimal类型的最大值?

例如:

decimal(5, 2)

请您解释一下decimal类型的机制。

1
@JamesZ 谢谢。如果我尝试输入 999.999 会怎么样? - Mosh Feu
为什么不试一下呢? - Lamak
1
你应该会收到一个数据截断错误。测试一下不是比在这里问更容易吗? - James Z
1
@Lamak,我的新问题,可以吗? - Mosh Feu
4
你应该去阅读官方文档。默认情况下,SQL Server在将数字转换为低精度和比例的十进制数值时会进行四舍五入。 - Lamak
显示剩余3条评论
2个回答

18

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

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

所以在你最初的例子中

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

我在此添加答案,因为当我尝试想起如何计算一个C#十进制数的SQL友好的上限值时,我的谷歌搜索结果带我来到了这里,该十进制数将进入一个 SQL (28,10) 十进制字段。

顺便提一下,它是 999999999999999999.9999999999


3
我认为指出这里的X被称为“精度”,它代表了包括小数在内的数字/位数的总量,而Y刻度则代表仅小数的总量可能会有所帮助。因此 - (5,2) ->P.E. 999.99 - S. Dre
太棒了!如果有人需要在JavaScript代码中使用此公式(例如,在输入字段上提供最大限制),我建议使用字符串来构建数字,而不是进行数学计算,因为JavaScript中存在浮点精度问题: var maxValue = (new Array(precision - scale + 1).join('9') + '.' + new Array(scale + 1).join('9')); - undefined

8

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

SELECT MAX(myColumn) AS MyColumnMax
FROM myTable

如果您想了解每个客户的最大值,例如,您可以按该客户进行分组。
SELECT CustomerID, MAX(OrderAmount) AS MaxOrderAmount
FROM CustomerOrders
GROUP BY CustomerID

您可以在这里找到其他聚合函数


如果你对于十进制类型的范围感兴趣,那么请注意,你正在声明数字和小数点的总位数。因此,当所有这些数字都为9时,就达到了最大值。
所以对于decimal(5,2),它将是999.99。其中5是小数点左右的总位数,2是小数点右侧的数字位数。
十进制数的最大可能范围是-10^38 + 1到10^38 - 1。

我的问题是关于十进制可能的最大值。 - Mosh Feu
你说了十进制列。但是你指的是十进制类型本身,它也可以用于TSQL中的变量和参数。 - Olivier Jacot-Descombes
谢谢,你的回答涵盖了我问题的所有信息。 - Mosh Feu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接