如果我尝试在xslt 2.0 1.6 * 100
中相乘,则会产生115.99999999999999
如何强制结果116
?
答案 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)