我正在尝试更多地理解数据类型。很少有例子让我感到困惑。
十进制(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指出超出范围的错误,但我没有得到同样的错误
的错误答案 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
减去 确定小数点左边的最大位数 点。可以存储到的最大小数位数 小数点右边。比例必须是0
到p
之间的值。 只有在指定精度时才能指定比例。默认 比例是0
;因此,0 <= s <= p
。
我强调了相关的短语。
为p
和s
指定相同的值(38)时,不会为小数点前的任何数字留出空间。