2013-07-18 60 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 

鑄造浮動是走最安全的方式。