2013-07-18 58 views
0

POWER MSDN文档, 表明,第一个参数过去吧,是,或者应该是,可转换为floatSQL服务器电源功能discrepanacy?

POWER (float_expression , y) 

但是当你运行

`Select power(19.8, 2) withoutCast, 
     power(Cast(19.8 as float), 2) withCast` 

你:

withoutCast  withCast 
------------ ---------------------- 
392.0   392.04 

正确的值当然应该是392.04。
该函数返回时,输入参数没有预先转换为浮动错误的答案。

这显然是由本声明MSDN文档,所记录:

“返回作为float_expression提交了相同的类型。例如,如果一个小数(2,0)被提交为float_expression,返回结果是十进制(2,0)。“

但是,如果我提交19.8作为第一表达,为何是函数假设它是一个十进制(19,0)和截断的答案的小数部分????

回答

2

为什么函数在输入参数 未预先转换为浮点数时返回错误答案?

不,该函数返回的值与参数的小数位数相同,除非您转换为浮点数。在返回试试这个,注意小数:

select power(2.3, 2), power(2.33, 2), power(2.333, 2) 

您可能会丢失的Significant figures的概念在被传递回什么方面。如果你将一个精确值传递给一个函数的一个十进制值,它不应该返回到那个精度吗?


为了把你的例子远一点,试试这个:

Select power(19.8, 6) withoutCast, power(Cast(19.8 as float), 6) withCast 

下面是结果:

withoutCast  WithCast 
60254729.6  60254729.561664 

现在,你真的认为这个值是精确到6小数位,因为我只是将它提升到第六力量?这是你缺少上下文的一部分是我还能走多远,仍然有我的结果的准确性因为有些人可能认为这是精确到第五或第六小数,如果你推断你的数据可能不是真的。

+0

是的,我注意到了这一点,如果我把它19.80,那么它的工作原理。我看到了逻辑,但这很令人不安。不,我希望有效数字的数量取决于函数的功能。将一个十进制数字提高到一个次幂要求结果中的小数位数多于输入值中的小数位数。如果你要求平均值为100的整数,都集中在值5的几位数字内,你是否乐意总是得到5的答案?这似乎是我对设计要求的一个疏忽。 –

+0

取决于我期望平均表达的格式。如果我拿一个整数的答案,那么我会期望5,因为这是答案。同样,可以将3分为2,如果是整数除法则得到1的回答,如果是合理除法则得到1.5的回答。对于手术的背景有些话要说。 –

+0

根据我的要求,我期望的是与默认功能不同的问题。默认情况下,它不应该失去精度。如果我执行'Select 2.2 * 2.2',它不会假设在“上下文”中,因为我乘以十进制(9,1)值,它应该生成一个4,0的十进制(9,1)结果,是吗? ?不,它会产生4.04的正确结果。 - 那么为什么在执行任何其他数学函数时呢?然而,+1解释如何工作... –

0

,因为它是通过它的返回相同的精度...

Select power(19.8, 2),power(19.80, 2),power(Cast(19.8 as float), 2) 

返回此:

392.0 392.04 392.04 

铸造浮动是走最安全的方式。