xslt 2.01.6 * 100
で乗算しようとすると、次のようになります。115.99999999999999
結果を強制する方法は116
?
Saxon9のようなXSLT2.0プロセッサをスタイルシートで使用version="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>
Saxon9.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>
「XSLT2プロセッサでXSLT1スタイルシートを実行しています」という警告と出力が表示されます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
sで動作することを確認する必要があります。
<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>
floatpointが動作しているため、許容誤差エラーが発生します:http: //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
次のようにコードを強制的に丸めます。
<xsl:template match="Number">
<Result>
<Total amount="{round(format-number(1.60, '#.00')*100)}"/>
</Result>
</xsl:template>