2016-04-19 4 views
0

フロア(10000000 * 1.1158)を実行しているとき、出力は11158000ではなく11157999です。しかし、フロア(11158000)を試してみると、私には良い値が返されます。XSLT - フロアの間違った値

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
format-number(floor(10000000 * 1.1158) div 10000000, '#.0000000') = <br/> 
    <xsl:value-of select="format-number(floor(10000000 * 1.1158) div 10000000, '#.0000000')"/> 
<br/><br/> 
floor(10000000 * 1.1158) div 10000000 = <br/> 
    <xsl:value-of select="floor(10000000 * 1.1158) div 10000000"/> 
<br/><br/> 
floor(10000000 * 1.1158) =<br/> 
    <xsl:value-of select="floor(10000000 * 1.1158)"/> 
<br/><br/> 
10000000 * 1.1158 = <br/> 
    <xsl:value-of select="10000000 * 1.1158"/> 
<br/><br/> 
floor(11158000 = 
<br/> 
    <xsl:value-of select="floor(11158000)"/> 
</body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

出力:

format-number(floor(10000000 * 1.1158) div 10000000, '#.0000000') = 
1.1157999 

floor(10000000 * 1.1158) div 10000000 = 
1.1157999 

floor(10000000 * 1.1158) = 
11157999 

10000000 * 1.1158 = 
11158000 

floor(11158000 = 
11158000 
+3

参照http://stackoverflow.com/questions/12746624/number-rounding-and-precision-problems-in-xslt-1-0およびhttp://stackoverflow.com/questions/3805248/xsl-rounding-フォーマット番号問題 –

答えて

1

あなたはXSLT 1.0を使用している場合は、すべての演算が倍精度浮動小数点です。これはすべての小数部分を正確に表すことができないため、近似を使用します。たとえば、1.1158に最も近いxs:double値はおそらく1.1157999999999のようなものです。正確な小数点演算が必要な場合は、XSLT 2.0でxs:decimalデータ型を使用する必要があります。

関連する問題