Orbeonフォーム(dev-post-3.7.1.200911140400)では、XPLにいくつかの計算を行うコードがあり、この計算の一部は結果を小数点以下2桁に丸めます。以下は、計算を行うために使用するコードの例です。OrbeonフォームのROUND関数の動作は何ですか?
<xsl:when test="$total_c_w != 0">
<gpa><xsl:value-of select="(round(($total_p_c_w div $total_c_w) * 100) div 100)"/></gpa>
</xsl:when>
ROUND関数に関する標準的なXPATHのドキュメントによると、 x.5を正の無限大に向かって四捨五入して、数値を最も近い整数に丸めます。
しかしROUND関数が238ではなく237.5から237に丸められている場合があります。これは単なる例であり、x.5を含む同様の問題が発生している場合もあります。例えば、言及について
、計算の値は、次のとおり
$total_p_c_w = 7.6, $total_c_w = 3.2
============================ ===========================
アレックス、 ガイダンスをありがとう。私はいくつかのデバッグを行い、最新のOrbeon Forms 3.9.0.201105152046 CEでテストした次のXSLコードを参照してください。
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
<xsl:template match="/">
<main>
<xsl:variable name="tppcw" select="/root/studentpcw/total_p_c_w" as="xs:double"/>
<xsl:variable name="tccw" select="/root/studentpcw/total_c_w" as="xs:double"/>
<xsl:variable name="tpcw" select="sum(/root/studentpcw/total_p_c_w)"/>
<xsl:variable name="tcw" select="sum(/root/studentpcw/total_c_w)"/>
<xsl:variable name="total_p_c_w" select="7.6"/>
<xsl:variable name="total_c_w" select="3.2"/>
<var1><xsl:value-of select="sum(/root/studentpcw/total_p_c_w)"/></var1>
<var2><xsl:value-of select="sum(/root/studentpcw/total_c_w)"/></var2>
<var3><xsl:value-of select="$total_p_c_w"/></var3>
<var4><xsl:value-of select="$total_c_w"/></var4>
<result1>
<xsl:value-of select="round(($total_p_c_w div $total_c_w) * 100)"/>
</result1>
<result2>
<xsl:value-of select="round(($tppcw div $tccw) * 100)"/>
</result2>
</main>
</xsl:template>
</xsl:transform>
は、このサンプル文書で上記のコードを適用します。
<root>
<studentpcw>
<total_p_c_w>7.6</total_p_c_w>
<total_c_w>3.2</total_c_w>
</studentpcw>
</root>
結果は全く予想外です。
<main xmlns:xs="http://www.w3.org/2001/XMLSchema">
<var1>7.6</var1>
<var2>3.2</var2>
<var3>7.6</var3>
<var4>3.2</var4>
<result1>238</result1>
<result2>237</result2>
</main>
問題は、私は変数にリテラル数を割り当て、丸め関数でその変数を使用する場合、結果は私は予想通りであることです。ノードから値を選択して変数に代入し、その変数を丸め関数で使用すると、結果は間違っているか、予期しないものになります。
アレックス、 あなたは上記の私の調査結果についてどう思いますか? Orbeon Formsが数値を選択し、それを後続の計算に使用する方法にバグのようです。 – Hoi
Hoi、これは 'xs:double'と' xs:decimal'の違いです。 '$ tppcw div $ tccw'を実行すると、' 2.375'ではなく '2.3749999999999996'が得られます。これは' xs:double'を使っているためです。ほとんどの場合、あなたが望むことはしません。代わりに、 'xs:decimal'を使います。あなたのコードでは、 'as =" xs:double "を' as = "xs:decimal" 'で置き換えると、期待通りの結果が得られます。 – avernet