【问题标题】:XPath SUM function returning rounded resultXPath SUM 函数返回舍入结果
【发布时间】:2016-05-27 12:45:29
【问题描述】:

我使用的 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

【问题讨论】:

    标签: xml linq c#-4.0 xpath xelement


    【解决方案1】:

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

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

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

    21135646351192300
    

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

    如果您真的需要这种精度(10 万亿的 100 误差无论如何都可以忽略不计),请坚持使用迭代方法。

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

    【讨论】:

    • 谢谢 - 我认为这一定是对 XPathEvaluate 的限制。我同意这个错误是微不足道的。问题是总和值被用作 API 请求的验证哈希,因此失败了。
    • 我明白了。考虑在实现 API 时告知开发人员这个陷阱。
    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多