7

我注意到一些我无法理解的奇怪的精确行为,我有一些 XML:

<CLD>
    <UCRV>
        <UCR1>.07</UCR1>
    </UCRV>
</CLD>

在 XSLT 文件中,我将值选择为便士(或看起来是 100 便士,我不知道为什么,但这是客户想要的!)为:

<xsl:value-of select="./s0:CLD/s0:UCRV/s0:UCR1/text() * 100 * 100"/>

但这输出为 700.00000000000011 数据类型为 xsd:Decimal。这里有一些默认的精度吗?我可以简单地对数字进行四舍五入,但我只是想更好地理解它。

谢谢

4

3 回答 3

5

浮点数不能精确地表示一切。由于数字是以二进制形式存储的,因此看起来很容易用十进制写的数字实际上有时只能用二进制来处理。0.07 就是这种情况,它在内部存储为 0.070000000000000011,就像您的情况一样。根据经验,您永远不应该信任浮点值,以便直接比较它们而不进行四舍五入。

于 2012-09-18T11:00:44.047 回答
4

正如人们已经解释的那样,XPath 中使用的唯一数字类型是 xs:double

number()函数将值转换为双精度值。因此,在 XPath 1.0 中对数字的操作可能而且有时确实会导致精度损失。

存在不同的解决方案

  1. 使用该round()功能。也可以使用floor()ceiling()功能。

  2. 使用 XSLT format-number()function() 或<xsl:number>指令。

请注意,XPath 2.0 支持所有 XSD 数字类型,包括xs:decimal. 不会导致精度损失的 XPath 2.0 表达式是:

xs:decimal(0.07)*100*100
于 2012-09-18T12:13:20.380 回答
3

这是标准的浮点数学。在这种情况下,有一个最大数量的位数来拟合该数字,并且该数字以二进制的科学形式保存。这里 0.07 不能精确表示,它被保存为 0.070000000000000011。

维基百科每个计算机科学家应该了解的关于浮点算法的 SO(尽管是其他语言)的许多问题

于 2012-09-18T11:05:34.493 回答