В Orbeon Forms (dev-post-3.7.1.200911140400) у нас есть код в XPL, который выполняет некоторые вычисления, и часть этого вычисления заключается в том, что мы округляем результат до 2 десятичных знаков. Ниже приведен пример кода, который мы используем для расчета:
<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>
В соответствии со стандартной документацией XPATH о функции ROUND; Округляет числовое значение до ближайшего целого числа, округляя x.5 до положительной бесконечности.
Но мы сталкиваемся со случаем, когда функция ROUND округляет 237,5 до 237 вместо 238. Это всего лишь пример, есть другие случаи, когда возникает аналогичная проблема, связанная с x.5.
Например, упомяните, значения в расчете:
$total_p_c_w = 7.6, $total_c_w = 3.2
=============================================== ======
Alex,
Спасибо за руководство. Я сделал еще несколько отладок и обнаружил что-то странное, пожалуйста, обратитесь к следующему коду XSL, который я тестировал на последних версиях Orbeon Forms 3.9.0.201105152046 CE.
<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>
Проблема в том, что, если я назначу буквенное число переменной и использую эту переменную в функции округления, результат будет таким, как я ожидал. Если я выберу значение из узла и назначу переменную и использую эту переменную в функции округления, результат будет неправильным или неожиданным.