根据SQL Server 2008联机丛书中的十进制和数字数据类型条目,精度为:
p(精度) 小数点左侧和右侧可存储的最大小数位数。精度必须是从1到最大精度为38的值。默认精度为18。
但是,下面的第二个选择失败,“算术溢出错误将int转换为数据类型数字。”
SELECT CAST(123456789 as decimal(9,0))
SELECT CAST(123456789 as decimal(9,1))
答案 0 :(得分:9)
见这里:http://msdn.microsoft.com/en-us/library/aa258832(SQL.80).aspx
十进制[(p [,s])]
p(精度)指定最大小数位数 可以存储在左侧 在小数点右边。 精度必须是1的值 通过最大的精度。该 最大精度为38.默认值 精度是18。
s(比例)指定可以的最大小数位数 存储在小数点右侧 点。比例必须是0的值 通过p。可以仅指定比例 如果指定了精度。默认 比例为0;因此,0 <= s <= p。 最大存储容量因基于而异 精度。
使用时:decimal(p,s)
,将p
视为要存储的总位数(无论小数点的左侧或右侧),以及s
的多少位数那些p
数字应该在小数点的右边。
DECIMAL(10,5)= 12345.12345
DECIMAL(10,2)= 12345678.12
DECIMAL(10,10)= .1234567891
DECIMAL(11,10)= 1.1234567891
您的示例代码失败:
SELECT CAST(123456789 as decimal(9,1))
因为:
9 =精度(小数点左右的总位数)
1 =比例(小数点右边的总位数)
(9-1)= 8(小数点左边的总位数)
并且您的值123456789需要小数点左边的9位数字。您需要decimal(10,1)
或decimal(9,0)
答案 1 :(得分:4)
正确。由于您正在执行decimal(9,1)
,这意味着您有9位总数,但,1
在小数点右侧保留了其中一位数,因此您最多只能在左侧8位和1位在右边。
答案 2 :(得分:0)
尝试
SELECT CAST(123456789为十进制(10,1))