天花板(转换(十进制,十进制))与天花板(转换(浮点数,小数值))

时间:2010-11-10 08:54:31

标签: sql

当我们做天花板(转换(十进制,8.09))然后结果是8并且在天花板(转换(浮点数,8.09))结果是9,解释?

2 个答案:

答案 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

floatfloat(53)(也是double的同义词),其精度为15位

你到底想要做什么?背景是什么?