当工作中遇到问题时,在使用与 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 = 0,595。由于 MDX 使用银行家四舍五入,因此应四舍五入为 0.60。
仅使用 Round(0,595) 即可给出正确的结果。
更奇怪的是,如果我们在集合中只使用 SomeNumber 6 次或更少,并且在 Round Function 中用相同的乘数除以我们得到 0.6(这是正确的)
此外,如果我用 StrToValue() 函数包装 Sum(),即使我在集合中使用超过 5 个 SomeNumber,它也能工作
这是怎么回事?!
最佳答案
不确定是否是您正在寻找的实际答案。您遇到的问题与数值精度(又称舍入误差)有关,而不是 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>
第一个 sum 是 mdx 计算值的方式。虽然略有不同,但足以更改 ROUND() 的结果。
有解决办法吗?
严格来说不,这是由于计算机数值计算的本质而导致的错误。实际上,您可以先作一点欺骗,直到 10 - ROUND(ROUND(MyNumber,10),2),但不太聪明(10 是一个例子)。
如果您有兴趣,请从维基百科 here 开始
关于ssas - Mdx Sum 返回非整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9196512/