我正在开发一个在 .Net Framework 2.0.50727.3603 上运行的 VB.Net 应用程序
当我触发这个 xquery 语句时,我得到 56,但预期是 55:
ceiling(.55*100)
我只在 0.55 和 0.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 具有单数字类型,即 double 浮点类型,与 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 类型而不是数字类型。
关于vb.net - xquery 上限函数的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6127815/