在Orbeon Forms(dev-post-3.7.1.200911140400)中,我們在XPL中有代碼進行一些計算,並且計算的一部分是我們將結果返回到2個小數位。以下是我們用來計算的代碼示例:Orbeon Forms中的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函數將237.5變爲237而不是238的情況。這僅僅是一個示例,還有其他情況下涉及x.5的類似問題正在發生。
例如提及,在計算中的值是:
$total_p_c_w = 7.6, $total_c_w = 3.2
============================ =========================
Alex, 感謝您的指導。我做了一些更多的調試並發現了一些奇怪的東西,請參考我在最新的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.3749999999999996',而不是'2.375',這是因爲你使用了'xs:double',在大多數情況下它不會做你想要的。相反,請使用'xs:decimal'。在你的代碼中,用'as =「xs:decimal」'替換'as =「xs:double」',你會得到預期的結果。 – avernet