7

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

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.

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

我的号码 50 总共只有 2 位数字(小于最大10)和小数点右侧的 0 位数字(小于最大9),因此它应该可以工作。

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

任何人都可以提供一种合理的方式来解释为匹配行为而编写的文档吗?

编辑:

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

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

并且对于“s(刻度)”更改“可以存储到小数点右侧的最大小数位数”。到“存储在小数点右侧的小数位数。从 p 中减去该数字以确定小数点左侧的最大位数。”

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

4

5 回答 5

12

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

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

于 2012-08-30T23:58:40.003 回答
7

我向 Connect 提交了一个错误报告:关于小数数据类型的误导性文档

于 2012-08-31T00:29:23.913 回答
2

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

于 2012-08-31T00:00:06.040 回答
1

DECIMAL(10, 9)是一种固定精度和小数位数的数字数据类型。这意味着它始终在小数点右侧存储相同数量的数字。所以你指定的数据类型只能存储小数点左边一位,右边九位的数字。显然,50不适合一些那种格式。

于 2012-08-31T00:00:51.137 回答
1

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

精度是数字中的位数。比例是数字中小数点右侧的位数。例如,数字 123.45 的精度为 5,小数位数为 2。

于 2013-03-16T10:18:26.740 回答