1

如果我尝试在 xslt 2.0 中相乘,1.6 * 100它将导致115.99999999999999

如何强迫它产生结果116

4

3 回答 3

5

您确定您version="2.0"在样式表中使用了像 Saxon 9 这样的 XSLT 2.0 处理器,并且 XPath 表达式包含像在您的示例中一样的数字文字1.6 * 100

因为在这种情况下你应该得到一个精确的结果,例如

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

<xsl:output method="text"/>

<xsl:template name="main">
  <xsl:value-of select="1.16 * 100"/>
</xsl:template>

</xsl:stylesheet>

撒克逊 9.4 输出116

结果与version="1.0"例如不同

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

<xsl:output method="text"/>

<xsl:template name="main">
  <xsl:value-of select="1.16 * 100"/>
</xsl:template>

</xsl:stylesheet>

我收到警告“使用 XSLT 2 处理器运行 XSLT 1 样式表”和输出115.99999999999999.

因此,使用 XSLT 2.0 处理器并且version="2.0"在您的代码中您应该不会遇到问题,文字表示xs:decimal数字。

如果您处理 XML 输入,那么它与例如不同

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

<xsl:output method="text"/>

<xsl:template match="item">
  <xsl:value-of select="a * b"/>
</xsl:template>

</xsl:stylesheet>

和输入

<root>
  <item>
    <a>1.16</a>
    <b>100</b>
  </item>
</root>

你明白了115.99999999999999

在这种情况下,您应该确保处理器与xs:decimals 一起工作

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs"
  version="2.0">

<xsl:output method="text"/>

<xsl:template match="item">
  <xsl:value-of select="xs:decimal(a) * xs:decimal(b)"/>
</xsl:template>

</xsl:stylesheet>
于 2013-01-30T13:39:19.673 回答
0

强制您的代码将其舍入,如下所示:

 <xsl:template match="Number">
    <Result>
       <Total amount="{round(format-number(1.60, '#.00')*100)}"/>
   </Result>
 </xsl:template>
于 2013-01-30T12:50:41.560 回答
0

浮点数在起作用,因此存在容差错误:http ://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

于 2013-01-30T12:55:16.293 回答