来自xquery上限功能的奇怪结果

时间:2011-05-25 16:34:37

标签: vb.net xpath xquery

我正在开发一个运行在.Net framework 2.0.50727.3603

上的VB.Net应用程序

当我触发这个xquery语句时,我得到56,但是期望55:

ceiling(.55*100)

我只看到.55和.56上的奇怪结果,因为你可以看到我的结果如下:

ceiling(.50*100) = 50
ceiling(.51*100) = 51
ceiling(.52*100) = 52
ceiling(.53*100) = 53
ceiling(.54*100) = 54
ceiling(.55*100) = 56 (would expect 55)
ceiling(.56*100) = 57 (would expect 56)
ceiling(.57*100) = 57
ceiling(.58*100) = 58
ceiling(.59*100) = 59
ceiling(.64*100) = 64
ceiling(.65*100) = 65
ceiling(.66*100) = 66

关于可能导致此问题的任何想法?这是xquery中的错误吗?

以下是我的代码的基本要点:

Imports System.Xml
Dim objXPathNavigator As XPathNavigator
evaluateExpression = objXPathNavigator.Evaluate(objXPathExpression)

1 个答案:

答案 0 :(得分:4)

XSLT / XPath 1.0有一个数字类型,一个双精度浮点类型,与VB.NET Double相同。如果你运行

Dim doubleArray As Double() = {0.5, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59}
For Each d As Double In doubleArray
    Console.WriteLine("d: {0}; d * 100: {1}; Math.Ceil(d * 100): {2}", d, d * 100, Math.Ceiling(d * 100))
Next
使用.NET,您会发现与XPath评估中发现的类似的奇怪之处。

所以问题是XPath 1.0(或其他语言)中该数字类型的精度有限,十进制表示(例如0.55)是有限的,但二进制表示可能不是。如果您需要更高的精度,您需要考虑转移到XPath 2.0,目前只有Saxon 9或XQSharp等第三方产品支持,然后您可以使用xs:decimal类型而不是数字类型。