1

xslt 2.01.6 * 100で乗算しようとすると、次のようになります。115.99999999999999

結果を強制する方法は116

4

3 に答える 3

5

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: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

floatpointが動作しているため、許容誤差エラーが発生します:http: //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

于 2013-01-30T12:55:16.293 に答える
0

次のようにコードを強制的に丸めます。

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