2012-04-22 56 views

回答

53
SELECT height/10.0 AS HeightDecimal FROM dbo.whatever; 

如果你想有一个特定的精密天平,则这样说:

SELECT CONVERT(DECIMAL(16,4), height/10.0) AS HeightDecimal 
    FROM dbo.whatever; 
+5

1为第一部分,但要注意,第二实施例的。这个'CONVERT'是在分裂之后应用的,并且不能给你多于已有的6位小数位数。 – 2012-12-17 12:30:13

+0

完美解决方案!我想第一个表现更好!不是吗? – Diablo 2016-05-09 08:40:42

+0

@Diablo那么,你可以测试它,但我怀疑你会发现任何区别。无论如何,如果您需要特定的精度/比例,请在您的应用程序层中进行格式化。 – 2016-05-09 14:33:16

17
SELECT CAST(height AS DECIMAL(18,0))/10 

编辑:这是如何工作的引擎盖下?

结果类型与两个参数的类型相同,或者如果它们不同,则由data type precedence table确定。因此,您可以将任何参数转换为非整数的参数。

现在DECIMAL(18,0),或者你能等效写只是DECIMAL,仍然是一种整数类型的,因为这0默认的比例意味着“没有数字的小数点右边”。因此,在不同的情况下,对四舍五入到整数的工作可能很好 - 这与我们正在努力完成的事情相反。

但是,DECIMALs对于一切都有自己的规则。他们通常是非整数,但总是精确的数字。在我们的例子中,我们强制出现的DECIMAL分区的结果类型是DECIMAL(29,11)。因此,除法结果将被舍入到11个不考虑除数为10的位置,但除以3时舍入变为可观察的。您可以通过操纵左侧操作数的比例来控制舍入的数量。通过在整个表达式中放置另一个ROUND或CAST操作,您也可以舍入更多,但不会更少。

相同力学支配在接受的答案的更简单和更好的解决方案:

SELECT height/10.0 

在这种情况下,该除数的类型是DECIMAL(3,1)和结果的类型是DECIMAL(17,6)。尝试除以3,观察舍入的差异。

如果你只是讨厌精度和规模的所有这些讨论,只想SQL服务器执行好老双精度浮点算术从某一点上所有的计算,你可以强制,太:

SELECT height/CAST(10 AS FLOAT(53)) 

或等价只是

SELECT height/CAST (10 AS FLOAT) 
5

您可以施放高度为十进制:

select cast(@height as decimal(10, 5))/10 as heightdecimal 

或者你把你的价值小数点你被划分:

declare @height int 
set @height = 1023 

select @height/10.0 as heightdecimal 

看到sqlfiddle用一个例子

2
select cast (height as decimal)/10 as HeightDecimal 
+0

'十进制(任何东西)'?为什么不指定? – 2012-04-22 20:10:13

+0

你对分裂是正确的,但可能产生溢出问题,例如乘法。 '十进制(H)* 10'一般可能不等于'十进制(G * 10)',以为我已经长大习惯投下第一操作 – Dewfy 2012-04-22 20:25:49

+3

之前我同意有明确的转换前的操作是更好的这样的方式。但我的观点是,如果你要说'小数',你应该说'小数(精度,比例)'。 – 2012-04-22 20:58:20

相关问题