Sql 上限(转换(十进制,小数)与上限(转换(浮点,小数))

Sql 上限(转换(十进制,小数)与上限(转换(浮点,小数)),sql,Sql,当我们做上限(转换(十进制,8.09))时,结果是8,在上限(转换(浮点,8.09))中,结果是9,解释一下?这是一个精度问题 因为 convert(decimal,8.09) == 8 鉴于 convert(float,8.09) == 8.09 decimal的默认精度为18 float是具有15位精度的float(53)(也是double的同义词) 你到底想做什么?什么是上下文?SQL中的DECIMAL类型使用精确的数字数据类型,而不是近似的数字数据类型,如FLOAT。这意味着数据

当我们做上限(转换(十进制,8.09))时,结果是8,在上限(转换(浮点,8.09))中,结果是9,解释一下?

这是一个精度问题

因为

convert(decimal,8.09) == 8  
鉴于

convert(float,8.09) == 8.09
decimal
的默认精度为18

float
是具有15位精度的
float(53)
(也是double的同义词)


你到底想做什么?什么是上下文?

SQL中的
DECIMAL
类型使用精确的数字数据类型,而不是近似的数字数据类型,如
FLOAT
。这意味着数据不仅存储数字,还存储其精度的维度,而相比之下,浮点始终是数值的缩放近似存储

小数、数值、p数(表示精度)和S数(表示刻度)共有3个部分。P数是数据类型可以存储的最大位数,因此,如果我有一个精度为4的
十进制
,我只能达到9999或低至0.001。默认值为18位

您遇到的问题是您的S号码。S数字是小数点后数字的精度,是P数字顶部的一种最大子集。所以S的精度为2意味着我可以得到0.01到0.99,4的精度是0.0001到0.9999,依此类推。如果不考虑最大位数,这与P结合会导致截断。因此,尽管数字12345.12345(P,S)=(6,3)的转换应具有3个十进制数字(
12345.123
),但最大数字为6,因此,为了具有S编号,您必须以(
12345.1
)结束,P编号还必须声明:

DECIMAL(P[,S])
这样,由于p和S的构造限制,p不能小于S,S不能小于0(最大位数仅为5的数字不能有14位小数):

为了解决您的问题,当您进行
转换时,请声明您需要的小数精度,因为默认情况下,
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)
选择CONVERT(十进制(10,1),12.345678)--最大10位,小数点后1位(四舍五入除外)
选择转换(十进制(18,3),12.2345)--最大18位,小数点后3位(除第三位小数四舍五入)
选择CONVERT(十进制(3,4),123.456789)--3个最大数字,4个小数位(除小数点后第4位四舍五入外,但溢出误差为P

我希望这对您有所帮助,如果可能,请始终使用十进制,并在您知道有边界的地方指定精度。根据过程的数据和性质,它可能更有效。

感谢您的回复,实际上我正在对一些大型存储过程进行性能调整,我发现一些查询语句使用这种转换,因此我将“float”替换为decimal,并希望检查性能,但我忘了定义精度,所以得到了错误的结果,所以被问到了问题。再次感谢。谢谢@Mitch Wheat,感谢您的评论和+1!
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)