当工作中出现问题时,使用与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使用Bankers四舍五入,因此应该舍入为0.60。
只需使用Round(0,595)就可以得到正确的结果。
更奇怪的是,如果我们在集合中仅使用SomeNumber 6次或更少,并且使用相同乘数的Round Function除以得到0.6(这是正确的)
另外,如果我使用StrToValue()函数包装Sum(),它就可以工作,即使我在集合中使用了超过5个SomeNumbers
怎么回事?!
答案 0 :(得分: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>
第一个,sum,是mdx如何计算该值。你有一点点差异,但它足以改变ROUND()的结果。
有解决方案吗?
严格说不,由于计算机数值计算的本质,这是一个错误。实际上你可以先把它作弊一点到10 - ROUND(ROUND(MyNumber,10),2),而不是brillant(10就是一个例子)。
如果您有兴趣从here
开始维基百科答案 1 :(得分:-1)
根据Chris Webb的说法,这种行为是故意的:
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]