2012-02-08 65 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