Ich habe eine XSLT wie unten:Falsche Multiplikationsergebnis durch XSLT mit javax.xml.transform (0,2 * 0,8 * 0,8)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="Test">
<Result>
<xsl:value-of select="number(depth)*number(width)*number(height)"/>
</Result>
</xsl:template>
Wenn ich testen dieses XSLT gegen die Probe unter Datei in Altova XML oder in W3CSchool here, erhalte ich das Ergebnis als 0.128
Beispieldatei:
<?xml version="1.0" encoding="UTF-8"?>
<Test>
<depth>.8</depth>
<width>.8</width>
<height>.2</height>
</Test>
Die Dinge ändern sich jedoch, wenn ich Java verwende, um das XSLT aufzurufen. Ich bekomme das Ergebnis als
<Result>0.12800000000000003</Result>
Im Folgenden wird der einfache Code Ich verwende:
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
public class TestMain {
public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("transform.xslt"));
Transformer transformer = factory.newTransformer(xslt);
Source text = new StreamSource(new File("input.xml"));
transformer.transform(text, new StreamResult(new File("output.xml")));
}
}
Frage: Warum wird der Java-Code die Ausgabe als 0,12800000000000003 geben? Auch 0,12800000000000000 ist verständlich, aber 0,12800000000000003 ist eine falsche Berechnung.
Mögliche Duplikate von [Warum sind Gleitkommazahlen ungenau?] (Http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate) –
Siehe: http://StackOverflow.com/questions/37400663/dezimal-genauigkeit-in-xslt/37407426 # 37407426 –
@ michael.hor257k Verstanden. Aber es ist XSLT V2. Also, Altova und Java-Programm sollte das gleiche Ergebnis geben, wenn wir oben sagen, Java-Code verwendet nicht XSLT V2 aber V1? – nitgeek