vb.net - xquery 上限函数的奇怪结果

标签 vb.net xpath xquery

我正在开发一个在 .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/

相关文章:

wpf - 应用程序设置中的VB.Net WPF键值对字典

xml - 获取当前节点的所有祖先

xslt - XPath 中是否有独占 OR 'XOR'?

xml - xquery 文件扩展名

c# - 更新包装对象的最佳方法

.net - XmlDocument.LoadXml() 挂了几分钟

python - 如何获取文本的 CSS 选择器

sql-server - 为什么在使用 XQuery 时执行计划中有排序

sql-server - LINQ to SQL - Xml 字段问题 - 你能拦截生成的 SQL 有多低?

vb.net - 在 VB.NET 中使用 LINQ 将数据表转换为字典