2012-02-08 68 views
2

如果在使用與Round()函數一起返回的值時,SUM()函數返回的值未被當作「正常」數字處理的工作中遇到問題。Mdx Sum返回非整數值

嘗試此MDX例如

WITH 
MEMBER SomeNumber AS 0.595 
SET SomeNumberSet AS 
      {[SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber] } 

MEMBER SomeNumberSum AS 
Round(SUM([SomeNumberSet], [Measures].[SomeNumber])/8, 2) 


SELECT [SomeNumberSum] ON 0 

FROM [SomeCube] 

此代碼返回0.59,組的總和是4.76,然後由8 = 0595劃分。由於MDX使用銀行家舍入,所以應該舍入到0.60。

只需使用Round(0,595)即可獲得正確的結果。

請告訴我更奇怪的是,如果我們在設定只使用SomeNumber 6倍以下,在同一乘數輪函數鴻溝,我們得到0.6(這是正確的)

另外,如果我換行Sum()與StrToValue()函數,它的工作原理,即使我在集合中使用多於5個SomeNumbers

發生了什麼?!

+0

這就是我們所說的錯誤或錯誤的文檔,甚至發生到MS :-) – ic3 2012-02-09 06:41:24

+0

會員SomeNumberSum圓形(0.595,2)足夠 – ic3 2012-02-09 06:42:03

+0

是, ROUND(0.595,2)返回正確的結果:) 但是,當一組超過X項目,除以X,則返回錯誤的值。 (X> 5) – 2012-02-09 14:19:18

回答

3

不知道是你要尋找的答案實際。這個問題與數字精度有關,也就是舍入誤差,而不是MDX。

如果您在Java中的時候,運行以下測試:

public void testNumeric() 
{ 
    double sum = 0.0; 
    double value = 0.595; 

    for (int i = 0; i < 8; i++) 
    { 
     sum += value; 
    } 

    double prod = value * 8; 
    assertEquals(sum/8, prod/8); 
} 

斷言會失敗,怪不?

Result : expected:<0.5949999999999999> but was:<0.595> 

第一個總和是mdx如何計算值。你有一些細微差別,但它足以改變ROUND()的結果。

有沒有解決方案?

嚴格地說沒有,這是一個錯誤,由於與計算機數值計算的本質。實際上,你可以首先做一個10位的圓形(ROUND(MyNumber,10),2),而不是高明(10是一個例子)。

如果你在維基百科興趣開始從here

-1

與克里斯·韋伯根據,這種行爲是故意的:

http://www.techonthenet.com/access/functions/numeric/round.php

如果您有Excel庫,這個工程:

WITH 
MEMBER SomeNumber AS 0.595 
SET SomeNumberSet AS 
      {[SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber] } 

MEMBER SomeNumberSum AS 
Excel!Round(SUM([SomeNumberSet], [Measures].[SomeNumber])/8, 2) 

SELECT [SomeNumberSum] ON 0 
FROM [Adventure Works] 
+0

在那篇文章中,他們討論銀行家舍入其中應該將其四捨五入,而不是圓下來。 – 2012-02-08 21:29:15

+0

0.595應舍入爲0。6就像我在我的問題中寫的那樣。 – 2012-02-08 22:58:15

+0

你可以在這裏查看Chris Webb的回覆:http://social.msdn.microsoft.com/forums/en-US/sqlanalysisservices/thread/3133ef66-4529-466c-bfa4-db733eff3917/ – 2012-02-09 16:42:16