首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ceiling(convert(decimal,decimalvalue))与Ceiling(convert(float,decimalvalue))

Ceiling(convert(decimal,decimalvalue))与Ceiling(convert(float,decimalvalue))
EN

Stack Overflow用户
提问于 2010-11-10 16:54:31
回答 2查看 2.2K关注 0票数 1

当我们做Ceiling(convert(十进制,8.09))时,结果是8,而在Ceiling(convert(float,8.09))结果是9,解释?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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数字:

代码语言:javascript
复制
DECIMAL(P[,S])

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

代码语言:javascript
复制
P >= [S] >= 0

要解决此问题,请在执行CONVERT时声明您需要小数的精确度,因为默认情况下,S值设置为:

代码语言:javascript
复制
SELECT CONVERT(DECIMAL(18,6), 8.09)

这里有几个展示精度的例子,运行它们并看看它们是如何工作的:

代码语言:javascript
复制
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,并在你知道有界限的地方指定一个精度。根据数据和过程的性质,它可以更有效。

票数 2
EN

Stack Overflow用户

发布于 2010-11-10 16:59:28

这是一个精度问题。

因为

代码语言:javascript
复制
convert(decimal,8.09) == 8  

鉴于

代码语言:javascript
复制
convert(float,8.09) == 8.09

decimal的默认精度为18

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4142675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档