当字段为十进制/双精度时,为什么8!= 8.000?

时间:2012-08-09 20:08:51

标签: orbeon xforms

我的XForm中有几个控件,我们只需将它们称为x和y。

x的值是8; y的值是8.000 我将约束设置为: $ x = $ y

显然,无论数据类型是双精度数还是十进制数,XForms都不认为这些值是相等的。

一种解决方案是: $ x - $ y = 0

但XForms会出现舍入错误吗? 所以现在它需要像: abs($ x - $ y)< 0.00001

是否有绝对值函数?

这对于应该简单的事情来说似乎很混乱。有没有更简单的方法让XForm考虑8 = 8.000?

3 个答案:

答案 0 :(得分:1)

我不知道那种语言,但是在伪代码中:

设置一些非常小的$ epsilon:=。00001

然后检查$ x - $ y< $小量

这显然不会捕获所有舍入错误,但只要你的应用程序没有做任何太重要的事情(如果你不应该使用浮点数),这应该考虑8和8.000相同。 / p>

编辑:我注意到你已经提出了这个答案,所以忽略这个:)

答案 1 :(得分:1)

在比较之前,您需要先输出值。

<xforms:input
  ref="foo"
  xxforms:format="format-number(xs:integer(.), '###,##0')"/>

有关详细信息,请参阅this link

答案 2 :(得分:0)

number()解决了问题,也不需要定义数据类型。请参阅以下简单代码。

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
    xmlns:xforms="http://www.w3.org/2002/xforms">

    <xhtml:head>
      <xhtml:title>Xforms</xhtml:title>

      <xforms:model>

        <xforms:instance id="main-instance">
            <form>
                <nodes>
                    <x>8</x>
                    <y>8.00</y>
                </nodes>
            </form>
        </xforms:instance>

        <xforms:bind id="x" nodeset="instance('main-instance')/nodes/x" />

        <xforms:bind id="y" nodeset="instance('main-instance')/nodes/y" />

      </xforms:model>

    </xhtml:head>

    <xhtml:body>

        <table>
            <tr>
                <td>
                    X is 
                    <xforms:output bind="x">
                        <xforms:alert>Invalid</xforms:alert>
                    </xforms:output>
                </td>
            </tr>
            <tr>
                <td>
                    Y is
                    <xforms:output bind="y">
                        <xforms:alert>Invalid</xforms:alert>
                    </xforms:output>
                </td>
            </tr>
            <tr>
                <td>
                    <strong>X = Y ? </strong>
                    <xforms:output value="instance('main-instance')/nodes/x = instance('main-instance')/nodes/y">
                        <xforms:alert>Invalid</xforms:alert>
                    </xforms:output>
                </td>
            </tr>
            <tr>
                <td>
                    <strong>(using number function) X = Y ? </strong>
                    <xforms:output value="number(instance('main-instance')/nodes/x) = number(instance('main-instance')/nodes/y)">
                        <xforms:alert>Invalid</xforms:alert>
                    </xforms:output>
                </td>
            </tr>
        </table>

    </xhtml:body>

</xhtml:html>

但是当我们给两个节点提供xforms:decimal数据类型而不使用数字函数时,它将无效(条件返回false)。