【发布时间】:2012-04-22 19:53:48
【问题描述】:
我的 SQL Server 表中的列 height 是整数类型。我想做一个除法,并在我的查询中将结果作为小数:
Select (height/10) as HeightDecimal
如何进行转换以使HeightDecimal 不再是整数?谢谢。
【问题讨论】:
标签: sql sql-server type-conversion
我的 SQL Server 表中的列 height 是整数类型。我想做一个除法,并在我的查询中将结果作为小数:
Select (height/10) as HeightDecimal
如何进行转换以使HeightDecimal 不再是整数?谢谢。
【问题讨论】:
标签: sql sql-server type-conversion
SELECT height/10.0 AS HeightDecimal FROM dbo.whatever;
如果你想要一个特定的精度刻度,那么就这么说吧:
SELECT CONVERT(DECIMAL(16,4), height/10.0) AS HeightDecimal
FROM dbo.whatever;
【讨论】:
CONVERT 是在除法后应用的,并且不能超过您已有的 6 位小数。
SELECT CAST(height AS DECIMAL(18,0)) / 10
编辑:这是如何运作的?
结果类型与两个参数的类型相同,或者,如果它们不同,则由data type precedence table 确定。因此,您可以将任一参数转换为非整数。
现在DECIMAL(18,0),或者你可以等效地写成DECIMAL,仍然是一种整数类型,因为0的默认比例意味着“小数点右边没有数字”。因此,在不同的情况下,对它进行强制转换可能会很好地舍入为整数——这与我们试图完成的相反。
但是,DECIMAL 对所有事物都有自己的规则。它们通常是非整数,但总是精确的数字。我们强制发生的 DECIMAL 除法的结果类型is determined specially 在我们的例子中是 DECIMAL(29,11)。因此,除法的结果将舍入到 11 位,这与除以 10 无关,但除以 3 时,舍入变得可观察到。您可以通过操纵左侧操作数的比例来控制舍入量。您还可以通过在整个表达式周围放置另一个 ROUND 或 CAST 操作来进行更多但不能更少的舍入。
相同的机制在公认的答案中支配着更简单和更好的解决方案:
SELECT height / 10.0
在这种情况下,除数的类型是DECIMAL(3,1),结果的类型是DECIMAL(17,6)。尝试除以 3 并观察四舍五入的差异。
如果您只是讨厌所有关于精度和小数位数的讨论,并且只是希望 SQL Server 从某个时候开始以良好的旧双精度浮点算术执行所有计算,那么您也可以强制这样做:
SELECT height / CAST(10 AS FLOAT(53))
或者等价的
SELECT height / CAST (10 AS FLOAT)
【讨论】:
您可以将高度转换为小数:
select cast(@height as decimal(10, 5))/10 as heightdecimal
或者您在除以的值中放一个小数点:
declare @height int
set @height = 1023
select @height/10.0 as heightdecimal
请参阅sqlfiddle 的示例
【讨论】:
select cast (height as decimal)/10 as HeightDecimal
【讨论】:
decimal(anything,anything)?为什么不指定?
decimal(h)*10一般不等于decimal(g*10),这样想我就养成了先投再投的习惯
decimal,你应该说decimal(precision,scale)。
char/varchar/nchar/nvarchar 的长度规范?
declare @xx int
set @xx = 3
select @xx
select @xx * 2 -- yields another integer
select @xx/1 -- same
select @xx/1.0 --yields 6 decimal places
select @xx/1.00 -- 6
select @xx * 1.0 -- 1 decimal place - victory
select @xx * 1.00 -- 2 places - hooray
还 _ 将 int 插入到 temp_table 中,使用类似 decimal(10,3) _ 可以正常工作。
【讨论】: