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)
    

解决方法

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类型而不是number类型。