返回舍入结果的 XPath SUM 函数
XPath SUM function returning rounded result
我正在使用的 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 Fiddle: https://dotnetfiddle.net/2niJ22
我想我至少找到了这种行为的原因(即使不是真正的解决方案)。如果你只是把求和结果输出到控制台,不解析,你会看到它是
Console.WriteLine(doc.XPathEvaluate("sum(//longs/long/text())"));
2.11356463511923E+16
这是“2.11356463511923 的(10 的 16 次方)”的科学计数法。把逗号右移16位数字,解析出来的数字就是
21135646351192300
我想这是 XPathEvaluate-Implementation 的一个限制。我想支持这一点,但我找不到关于此扩展限制的任何内容。
如果您真的需要这种精度(10 千万亿次上 100 的误差无论如何都可以忽略不计),请坚持使用迭代方法。
无论如何感谢您指出这一点,知道这样的事情总是很高兴!
我正在使用的 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 Fiddle: https://dotnetfiddle.net/2niJ22
我想我至少找到了这种行为的原因(即使不是真正的解决方案)。如果你只是把求和结果输出到控制台,不解析,你会看到它是
Console.WriteLine(doc.XPathEvaluate("sum(//longs/long/text())"));
2.11356463511923E+16
这是“2.11356463511923 的(10 的 16 次方)”的科学计数法。把逗号右移16位数字,解析出来的数字就是
21135646351192300
我想这是 XPathEvaluate-Implementation 的一个限制。我想支持这一点,但我找不到关于此扩展限制的任何内容。
如果您真的需要这种精度(10 千万亿次上 100 的误差无论如何都可以忽略不计),请坚持使用迭代方法。
无论如何感谢您指出这一点,知道这样的事情总是很高兴!