2016-04-19 15 views
0

Wenn ich einen Boden (10000000 * 1.1158) mache, ist die Ausgabe 11157999 statt 11158000. Aber wenn ich einen Boden (11158000) versuche, gibt es mir den guten Wert zurück.XSLT - Floor falscher Wert

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

Ausgang:

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

Siehe http://stackoverflow.com/questions/12746624/number-rounding-and-precision-problems-in-xslt-1-0 und http://stackoverflow.com/questions/3805248/xsl-rounding- Format-Nummer-Problem –

Antwort

1

Wenn Sie XSLT verwenden 1.0 dann alle Arithmetik mit doppelter Genauigkeit Punkt schweben. Dies kann nicht alle Dezimalbrüche genau darstellen, daher wird eine Approximation verwendet. Zum Beispiel ist der nächste xs: double Wert zu 1.1158 wahrscheinlich etwas wie 1.1157999999999. Wenn Sie eine genaue Dezimalarithmetik wünschen, müssen Sie in XSLT 2.0 den Datentyp xs: decimal verwenden.