这个很简单。为什么下面的代码导致下面的错误?
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 documentation,p
(在我的情况下为10)是“可以存储的最大小数位数,小数点左侧和右侧“而s
(或我的情况下为9)是”最大可以存储的小数位数正确的小数点。“
我的号码50只有2位数字(小于最大值 10),小数点右边0位数(小于最大值 9)因此它应该有用。
我发现this question基本上是同一个问题,但没有人解释为什么文档似乎与行为发生冲突。似乎s
维度实际上被解释为小数点右边的固定位数,并且从 p中减去 号码,在我的情况下留下10 - 9 =只剩下1位数来处理左侧。
任何人都可以提供合理的方式来解释所写的文档以符合行为吗?
修改
我在下面看到一些解释,但它们没有解决文档措辞的根本问题。我会建议改变措辞:
对于“p(精度)”,将“可以存储的最大小数位数”更改为“将 存储的最大小数位数”。
对于“s(比例)”更改“可以存储在小数点右侧的最大小数位数。” to“将存储在小数点右侧的小数位数。从p中减去此数字以确定小数点左边的最大位数。”
我将向Connect提交错误报告,除非有人有更好的解释。
答案 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。