十进制转换比例错误

时间:2016-03-11 05:38:30

标签: sql-server sql-server-2008 tsql

我正在尝试更多地理解数据类型。很少有例子让我感到困惑。

  

十进制(p,s) - p是总位数,s是点之后的位数

以下给出了示例

declare @st decimal(38,38)
set @st=1.22121065111115211641641651616511616

我收到以下错误..

  

将数字转换为数据类型数字

的算术溢出错误
点之后的

len(数字)为35,包括总数。是37 ...不应该是我的小数(38,38)工作

所以我的问题是为什么我收到上述错误

到目前为止,这是我的研究。

How do I interpret precision and scale of a number in a database?

降低比例如下工作..

declare @st decimal(38,37)
set @st=1.22121065111115211641641651616511616

回答boumbh指出超出范围的错误,但我没有得到同样的错误

的错误

2 个答案:

答案 0 :(得分:1)

@TheGameisWar

根据上面的示例,您指定了 decimal(38,38)。 和值= 1.22121065111115211641641651616511616,Sql Server检查它们是否是点左边的任何数字。因为(p-s)给出了左边的总位数。因此,如果我们为你的情况做,我们得到(38-38)=(0)

因此,您给出的值不满足小数精度和小数值。 如果你在该点的左侧放置0,那么它可以工作 例如: - 0.22121065111115211641641651616511616

对于以下情况十进制(38,37),我们得到(38-37)=(1)因此可以接受一个数字左边的数字。因此,价值被接受并执行。

精度和比例间接决定点左边的位数。 :)

答案 1 :(得分:1)

答案在MSDN

  

decimal[ (p[ , s] )]

     

p (precision)最大总小数位数   存储在小数点的左侧和右侧。该   precision必须是从1到最大精度为38的值。   默认精度为18。

     

s (scale)将存储到的小数位数   小数点右边。 此号码从p减去   确定小数点左边的最大位数   点。可以存储到的最大小数位数   小数点右边。比例必须是0p之间的值。   只有在指定精度时才能指定比例。默认   比例是0;因此,0 <= s <= p

我强调了相关的短语。

ps指定相同的值(38)时,不会为小数点前的任何数字留出空间。