当我们做天花板(转换(十进制,8.09))然后结果是8并且在天花板(转换(浮点数,8.09))结果是9,解释?
答案 0 :(得分:2)
SQL中的DECIMAL
类型使用精确数字数据类型而不是像FLOAT
这样的近似数值数据类型。这意味着数据不仅存储数字,而且存储精确度的大小,而相比之下,浮点数始终是数值的缩放近似存储。
DECIMAL
精度,值,P数(精度)和S数(刻度)共有3个。 P数是数据类型可以存储的最大位数,因此如果我有一个精度为4的DECIMAL
,我只能达到9999或低至0.001。默认值为18位。
您遇到的问题是您的S号码。 S编号是小数点后面的数字的精度,是P编号顶部的一种子集最大值。所以S精度为2意味着我可以有.01到.99,4精度为.0001到.9999等等。如果不考虑最大数字,这与P组合可能会导致截断。因此,尽管数字12345.12345(P,S)=(6,3)的转换应该具有3个十进制数字(12345.123
),但最大数字为6,因此最终得到(12345.1
)要获得S编号,还必须声明P编号:
DECIMAL(P[,S])
这样,由于P和S的结构限制,P不能小于S且S不小于0(在最大数字仅为5的数字中不能有14个小数位):
P >= [S] >= 0
要解决您的问题,当您执行CONVERT
时,请声明您需要精确到十进制的精确度,默认情况下,S
值设置为 0 :
SELECT CONVERT(DECIMAL(18,6), 8.09)
以下是一些显示精度的示例,运行它们并查看它们的工作原理:
SELECT CONVERT(DECIMAL(10,1) , 12.345678) --10 Maximum Digits, 1 Decimal Places (Expect round off)
SELECT CONVERT(DECIMAL(18,3) , 12.2345) --18 Maximum Digits, 3 Decimal Places (Expect 3rd decimal round up)
SELECT CONVERT(DECIMAL(3,4) , 123.456789) --3 Maximum Digits, 4 Decimal Places (Expect 4th decimal round up, but get overflow error as P < S )
SELECT CONVERT(DECIMAL(18,6) , 8.09) --18 Maximum Digits, 6 Decimal Places (Expect no data change in precision)
我希望能帮助你,如果可能的话,总是使用小数并指定你知道有界限的精度。根据程序的数据和性质,它可以更有效。
答案 1 :(得分:1)
这是一个精确的问题。
由于
convert(decimal,8.09) == 8
,而
convert(float,8.09) == 8.09
decimal
的默认精度为18
float
是float(53)
(也是double的同义词),其精度为15位
你到底想要做什么?背景是什么?