这个很简单.为什么下面的代码导致下面的错误?
declare @dTest decimal(10, 9)
set @dTest = 50
Run Code Online (Sandbox Code Playgroud)
错误:
Msg 8115, Level 16, State 8, Line 3
Arithmetic overflow error converting int to data type numeric.
Run Code Online (Sandbox Code Playgroud)
根据MSDN文档上decimal(p, s),p(在我的情况或10)是"的可存储的,小数位最大总数二者的左侧和小数点的右边,而" s(或在我的情况9)被" 可以存储在小数点右侧的最大小数位数".
我的数字50,总共只有2位数(小于最大值 10位),小数点右边的0位数(小于最大值 9 位数),因此它应该有效.
我发现这个问题基本上是同一个问题,但没有人解释为什么文档似乎与行为冲突.似乎s维度实际上被解释为小数点右边的固定位数,并从p号中减去,在我的情况下,10-9 =仅剩余1位数来处理左侧.
任何人都可以提供合理的方式来解释文档,以符合行为吗?
编辑:
我在下面看到一些解释,但它们没有解决文档措辞的根本问题.我会建议改变措辞:
为"P(精度)"改变"的十进制数字的最大总数可存储"读"的那个十进制数字的最大总数将被存储的".
并且对于"s(比例)"更改"可以存储在小数点右侧的最大小数位数." to" 将存储在小数点右侧的小数位数.从p中减去此数字以确定小数点左侧的最大位数."
我将向Connect提交错误报告,除非有人有更好的解释.