xslt中的1.16 * 100产生115.99999999999999

时间:2013-01-30 12:37:21

标签: xslt xslt-2.0

如果我尝试在xslt 2.0 1.6 * 100中相乘,则会产生115.99999999999999

如何强制结果116

3 个答案:

答案 0 :(得分:5)

您确定在样式表中使用了Saxon 9和version="2.0"之类的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>

Saxon 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:decimal一起使用
<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>

答案 1 :(得分:0)

强制您的代码将其舍入:

 <xsl:template match="Number">
    <Result>
       <Total amount="{round(format-number(1.60, '#.00')*100)}"/>
   </Result>
 </xsl:template>

答案 2 :(得分:0)

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