Ssas Mdx Sum返回非整数值

Ssas Mdx Sum返回非整数值,ssas,mdx,olap,Ssas,Mdx,Olap,如果在使用与Round()函数一起返回的值时,SUM()函数返回的值未被视为“正常”数,则会出现问题 例如,试试这个MDX WITH MEMBER SomeNumber AS 0.595 SET SomeNumberSet AS {[SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber], [SomeNumber] } MEMBER

如果在使用与Round()函数一起返回的值时,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(0595)就可以得到正确的结果

更奇怪的是,如果我们在集合中只使用SomeNumber 6次或更少,在舍入函数中用相同的乘法器除以,我们得到0.6(这是正确的)

另外,如果我用StrToValue()函数包装Sum(),即使我在集合中使用了5个以上的数字,它也能工作


怎么回事

根据Chris Webb的说法,这种行为是故意的:

如果您有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]

不确定你要找的是什么样的答案。与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);
}
public void testNumeric()
{
双和=0.0;
双值=0.595;
对于(int i=0;i<8;i++)
{
总和+=数值;
}
双针=值*8;
资产质量(总和/8,产品/8);
}
断言会失败,奇怪吗

Result : expected:<0.5949999999999999> but was:<0.595>
结果:预期:但为:
第一个是sum,它是mdx如何计算值的。您得到了一个微小的差异,但它足以更改回合()的结果

有解决办法吗

严格地说,不,这是一个错误,因为计算机数值计算的本质。实际上,你可以先作弊一点到10轮(round(我的数字,10),2),而不是brillant(10就是一个例子)


如果你对维基百科感兴趣,从

那篇文章开始,他们讨论了银行家的取整,取整应该是向上取整,而不是向下取整。0.595应该四舍五入到0.6,就像我在我的问题中所写的那样。你可以在这里查看Chris Webb的回复:我们称之为bug或错误文档的情况,甚至发生在MS:-)成员SomeNumberSum是圆形的(0.595,2)是足够的是,四舍五入(0.595,2)返回正确的结果:)但是当在一个包含超过X项的集合中,除以X,它返回错误的值。(x>5)好的,这是一个严格=5的问题。这不是一个带有双重含义的“经典”问题吗?->您总是会遇到一些舍入、精度问题,您可能会遇到5.94999999999iccube之类的问题,而不是,如果您舍入
somenumber
而不求和,结果是0.6