十进制(10,9)变量不能保持数字50(SQL Server 2008)

时间:2012-08-30 23:57:07

标签: sql-server sql-server-2008

这个很简单。为什么下面的代码导致下面的错误?

declare @dTest decimal(10, 9)
set @dTest = 50

错误:

Msg 8115, Level 16, State 8, Line 3
Arithmetic overflow error converting int to data type numeric.

根据decimal(p, s)上的MSDN documentationp(在我的情况下为10)是“可以存储的最大小数位数,小数点左侧和右侧“而s(或我的情况下为9)是”最大可以存储的小数位数正确的小数点。“

我的号码50只有2位数字(小于最大值 10),小数点右边0位数(小于最大值 9)因此它应该有用。

我发现this question基本上是同一个问题,但没有人解释为什么文档似乎与行为发生冲突。似乎s维度实际上被解释为小数点右边的固定位数,并且从 p中减去 号码,在我的情况下留下10 - 9 =只剩下1位数来处理左侧。

任何人都可以提供合理的方式来解释所写的文档以符合行为吗?

修改

我在下面看到一些解释,但它们没有解决文档措辞的根本问题。我会建议改变措辞:

对于“p(精度)”,将“可以存储的最大小数位数”更改为“ 存储的最大小数位数”。

对于“s(比例)”更改“可以存储在小数点右侧的最大小数位数。” to“存储在小数点右侧的小数位数。从p中减去此数字以确定小数点左边的最大位数。”

我将向Connect提交错误报告,除非有人有更好的解释。

5 个答案:

答案 0 :(得分:10)

10 - 9为1. DECIMAL(10, 9)可以保存0.000000000格式的数字。 50在小数点前有两位数,因此超出范围。你自己引用了它:

  

根据关于十进制(p,s)的MSDN文档,p(或我的情况下为10)是“可以存储的最大小数位数,在左侧和右侧小数点“而s(或我的情况下为9)是”可以存储在小数点右侧的最大小数位数。“

答案 1 :(得分:5)

我向Connect提交了一个错误报告:Misleading documentation on the decimal data type

答案 2 :(得分:2)

解释文档的合理方法是不忽略尾随小数零位数。所以你的号码在小数点右边有9位小数,它们都恰好是0

答案 3 :(得分:1)

DECIMAL(10, 9)是一种固定的精度和比例数值数据类型。这意味着它始终在小数点右侧存储相同的位数。因此,您指定的数据类型可以存储小数点左侧一位数和右侧9位数的数字。显然,50不适合多种格式。

答案 4 :(得分:1)

通过以下链接。 http://msdn.microsoft.com/en-gb/library/ms190476.aspx

精确度是数字中的位数。 Scale是数字中小数点右边的位数。例如,数字123.45的精度为5,标度为2。