XSLT1.0中的和差问题/错误

XSLT1.0中的和差问题/错误,xslt,floating-point,Xslt,Floating Point,我有这些XML数据,并尝试使用下面的XSLT代码段对其进行汇总 Xml <?xml version="1.0" encoding="utf-8"?> <values> <value>159.14</value> <value>-2572.50</value> <value>-2572.50</value> <value>2572.50</value&g

我有这些XML数据,并尝试使用下面的XSLT代码段对其进行汇总

Xml

<?xml version="1.0" encoding="utf-8"?>
<values>
    <value>159.14</value>
    <value>-2572.50</value>
    <value>-2572.50</value>
    <value>2572.50</value>
    <value>2572.50</value>
    <value>-159.14</value>
</values>

159.14
-2572.50
-2572.50
2572.50
2572.50
-159.14
Xslt

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <xsl:value-of select="sum(values/value)"/>
</xsl:template>

</xsl:stylesheet>

在我的世界里,值应该是0,但最终值是-0.000000000000568434188608081


在VisualStudio中运行它并亲自查看为什么?会发生这种情况吗?

增加一轮怎么样

round(sum(values/value))

似乎XSLT处理器在求和之前将十进制数字字符串转换为浮点精度数字

您可以始终使用舍入函数并除以所需精度,或者使用格式数字函数(如果可用):

<xsl:template match="/">
    <xsl:value-of select="round(sum(values/value)) div 100"/><br />
    <xsl:value-of select="format-number(sum(values/value), '0.00')"/>
</xsl:template>


试试这个

<xsl:value-of select="format-number(sum(values/value),'0.00')"/>


为了给下面给出的解决方案增加一点完整性,并回答您的“为什么?”问题,请查看“每个计算机科学家都应该知道的浮点算术知识”,上面发表了相同的评论,但这里也有类似的评论。为了给下面给出的解决方案增加一点完整性,并回答您的“为什么?”问题,请查看“每一位计算机科学家都应该知道关于浮点运算的知识”@Riri:如果您对这种行为感到惊讶,我认为:并且公认答案中的链接页值得一读。