2016-07-15 10 views
0

Ich habe XML wie diese,XSLT - unter Verwendung round() Funktion

<doc> 
    <p>20</p> 
    <p>20</p> 
    <p>20</p> 
    <p>100</p> 
    <t>160</t> 
</doc> 

Es gibt 4 <p> Elemente mit Zahlen enthalten und <t> stellen die insgesamt über 4 <p> Elemente.

was mein Ziel ist berechnen Prozent dieser <p> Elemente und Anzeige.

Dies ist xsl Code, den ich für sie geschrieben habe,

<xsl:variable name="val1" select="abc:get-int-value(doc/p[1]/text())" as="xs:double"/> 
    <xsl:variable name="val2" select="abc:get-int-value(doc/p[2]/text())" as="xs:double"/> 
    <xsl:variable name="val3" select="abc:get-int-value(doc/p[3]/text())" as="xs:double"/> 
    <xsl:variable name="val4" select="abc:get-int-value(doc/p[4]/text())" as="xs:double"/> 
    <xsl:variable name="valTotal" select="abc:get-int-value(doc/t/text())" as="xs:double"/> 

    <xsl:variable name="precentage1" select="round(($val1 div $valTotal)*100)" as="xs:double"/> 
    <xsl:variable name="precentage2" select="round(($val2 div $valTotal)*100)" as="xs:double"/> 
    <xsl:variable name="precentage3" select="round(($val3 div $valTotal)*100)" as="xs:double"/> 
    <xsl:variable name="precentage4" select="round(($val4 div $valTotal)*100)" as="xs:double"/> 

    <xsl:template match="doc"> 
     <xsl:value-of select="$precentage1"/> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="$precentage2"/> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="$precentage3"/> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="$precentage4"/> 
    </xsl:template> 

    <xsl:function name="abc:get-int-value" as="xs:double"> 
     <xsl:param name="text" as="xs:string"/> 

     <xsl:analyze-string select='$text' regex='\d+'> 
      <xsl:matching-substring> 
       <xsl:sequence select="number(.)"/> 
      </xsl:matching-substring> 
     </xsl:analyze-string> 
    </xsl:function> 

Aber es gibt Prozentwerte wie, 13,13,13 und 63. So Summe dieser Zahlen sind 102 (wörtlich sollte es sei 100, 99 oder 101). es scheint der Prozentwert von p [4] hat sich auf 63 statt 62 abgerundet.

Warum passiert das und wie kann ich das beheben?

Antwort

0

So round Funktion funktioniert: es eine ganze Zahl im Wert dem Argument am nächsten zurückgibt, was bedeutet, dass round(62.5) = 63

Was Sie tun können, extrahieren ist percenatge1, prozentsatz2 und prozentsatz3 von 100 und erhalten percentage4, weil alle diese drei Prozentwerte sollten Sie insgesamt 100%, dh geben:

<xsl:variable name="precentage4" select="100 - $precentage1 - $precentage2 - $precentage3" as="xs:double"/> 
+0

Danke für die Antwort. Genaue Prozentwerte sind 12.51, 12,51, 12,51 und 62,25 .. Also 62,25 sollte auf 62 aufgerundet werden? – sanjay

+0

@sanjay, wie kommt es? '100' ist genau' 62.5% 'von' 160' –

+0

@sanjay Woher hast du diese Prozentwerte? Die richtigen Werte sind 12,5, 12,5, 12,5 und 62,5. – JLRishe

1

warum dieses

geschieht

Ihre erwarteten Werte sind falsch und machen nicht einmal Sinn. 20 div 160 ist 12,5 und 100 div 160 ist 62,5. 12,5 Runden bis zu 13 und 62,5 Runden bis zu 63, und dies sind die Werte, die Sie sehen.

Rounding erzeugt von Natur aus einen ungenauen Wert, so dass Sie nicht vier abgerundeten Prozent erwarten können immer hinzufügen, bis zu 100.

wie kann ich dieses Problem beheben

Ich glaube, Sie brauchen, um Entscheiden Sie, wie Sie diese Diskrepanz beheben möchten. Die round() Funktion funktioniert genau wie es soll.

1

Wie kann ich das beheben?

Wie andere bereits erläutert haben, können Sie das nicht "reparieren".

Sie können das Problem jedoch leicht beheben, indem Sie round-half-to-even() anstelle von round() verwenden. Wie es passiert, verschiebt es in dem gegebenen Beispiel das Problem nur auf die andere Seite - d.h. die Ergebnisse werden 12, 12, 12, 62 mit insgesamt 98 sein. Aber im Durchschnitt wird der Rundungsfehler kleiner sein.

Verwandte Themen