XPath SUM函数返回舍入结果

时间:2016-02-16 09:54:29

标签: xml linq c#-4.0 xpath xelement

我使用的API需要一个哈希,它由所有特定元素的值之和组成。例如,假设它是示例XML中的<long>元素。

当我使用XPath SUM函数计算这个值时,我得到的值与我在迭代和添加节点时得到的值不同。这是为什么?

string xml = @"
<longs>
    <long>10567823175596159</long>
    <long>10567823175596159</long>
</longs>
";

XDocument doc = XDocument.Parse(xml);

Console.WriteLine(long.Parse(doc.XPathEvaluate("sum(//longs/long/text())").ToString(), 
                            System.Globalization.NumberStyles.Float));

var accountNumbers = doc.XPathSelectElements("//longs/long");

long sum=0;
foreach (var accountnumber in accountNumbers)
{
    sum += long.Parse(accountnumber.Value);
}

Console.WriteLine(sum);

输出:

21135646351192300

21135646351192318

.Net小提琴:https://dotnetfiddle.net/2niJ22

1 个答案:

答案 0 :(得分:1)

我认为我至少找到了这种行为的原因(即使不是真正的解决方案)。如果您只是将求和结果输出到控制台而不进行解析,您将看到它是

Console.WriteLine(doc.XPathEvaluate("sum(//longs/long/text())"));
2.11356463511923E+16

“2.11356463511923 by(10-16th power)”的科学记数法。通过将逗号16的数字向右移动,解析的数字将为

21135646351192300

我猜这是XPathEvaluate-Implementation的限制。我想支持这个,但我找不到任何关于此扩展的限制。

如果你真的需要这种精度(10万亿分之一的误差是任何可以忽略不计的话)坚持迭代的方法。

无论如何,谢谢你指出这一点,总是很高兴知道这样的事情!