当我们做Ceiling(convert(十进制,8.09))时,结果是8,而在Ceiling(convert(float,8.09))结果是9,解释?
发布于 2010-11-10 17:33:38
SQL中的DECIMAL类型使用精度数值数据类型,而不是像FLOAT这样的近似数值数据类型。这意味着数据不仅存储数字,而且存储其精度的维度,而相比之下,浮点数始终是数值的缩放近似值存储。
DECIMAL精度有3个部分:值、P数字(用于精度)和S数字(用于小数位数)。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值设置为:
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)我希望这对你有所帮助,如果可能的话,总是使用decimal,并在你知道有界限的地方指定一个精度。根据数据和过程的性质,它可以更有效。
发布于 2010-11-10 16:59:28
这是一个精度问题。
因为
convert(decimal,8.09) == 8 鉴于
convert(float,8.09) == 8.09decimal的默认精度为18
float是float(53) (也是double的同义词),精度为15位
你到底想做什么?上下文是什么?
https://stackoverflow.com/questions/4142675
复制相似问题