这个很简单。为什么下面的代码会导致下面的错误?
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文档 on decimal(p, s),p (在我的例子中是10 )是“可以存储在小数点左边和右边的十进制数字的最大总数”,而s (在我的例子中是9)是“可以存储在小数点右侧的最大十进制数”。
我的数字,50,只有2位数字总计(小于最大值10),0位数在小数的右边(小于最大值9),因此它应该能工作。
我在这个问题中发现了本质上相同的问题,但没有人解释为什么文档似乎与行为冲突。看起来,s维实际上被解释为小数点右边的固定数字,并从p数中减去,在我的例子中,只有10-9=1位数才能处理左侧。
有人能提供一种合理的方式来解释文档的编写以匹配行为吗?
编辑:
我在下面看到了一些解释,但它们并没有解决文档的基本问题。我建议在措辞上作如下修改:
对于"p (精度)“,”更改“可存储的最大十进制数字总数”读“”将存储的十进制数字的最大总数“。
对于"s (刻度)“,”更改“可以存储在小数点右侧的最大小数位数。以“将存储在小数点右侧的小数位数。该数字从p中减去,以确定小数点左侧的最大数字数。”
我将向Connect提交一个bug报告,除非有人有更好的解释。
发布于 2012-08-31 00:29:23
我向Connect提交了一个bug报告:关于十进制数据类型的误导性文档
发布于 2012-08-30 23:58:40
10 -9是1. DECIMAL(10, 9)可以用0.000000000格式保存一个数字.50在小数点之前有两位数,因此超出了范围。你自己引用了它:
根据关于十进制(p,s)的MSDN文档,p(在我的例子中是10 )是“可以存储的最大十进制数字总数,在小数点的左边和右边”,而s(在我的例子中是9)是“可以存储在小数点右侧的最大小数位数”。
发布于 2012-08-31 00:00:06
解释文档的一个合理方法是不忽略尾随的十进制零位数。所以你的数字在小数点右边有9个小数位,它们都是0。
https://stackoverflow.com/questions/12207222
复制相似问题