SaxonHE XQuery 求和运算精度

SaxonHE XQuery sum operation precision

我有一个这样的xml文档

<root>
  <a>20947441.21</a>
  <b>9961900</b>
  <c>27360153.6</c>
  <d>222864.95</d>
  <e>10489146.31</e>
</root>

并且我需要得到根的子元素的总和。因此,使用 SaxonHE 处理器 (v 10.5) 执行以下 xquery 表达式:

let $s := (/root/a, /root/b, /root/c, /root/d, /root/e), $res := sum($s) return $res

表达式的结果是6.898150607000001E7。为什么不是68981506.07?如果没有科学记数法和适当的精度,我如何无法获得可预测的结果?

您可以使用format-number函数:

return format-number($res, '#.00')

并且您可以将表达式简化为 select root 的所有直接子代:

let $s := (/root/*), $res := sum($s) return format-number($res, '#.00')

甚至

let $res := sum(/root/*) return format-number($res, '#.00')

使用 xs:decimal 数据类型而不是默认的 number/xs:double 通过简单地选择 sum(root/*/xs:decimal(.)) 或者,在您的样本的上下文中, sum($s ! xs:decimal(.)).