#vb.net #xpath #xquery
#vb.net #xpath #xquery
Вопрос:
Я работаю над VB.Приложение Net запущено.Net framework 2.0.50727.3603
Когда я запускаю этот оператор 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. Вы должны принять ответ — это официальная и ожидаемая форма благодарности в SO. Для этого просто нажмите на зеленую галочку рядом с лучшим ответом.
Ответ №1:
XSLT / XPath 1.0 имеет тип с одним числом, тип с плавающей запятой двойной точности, который совпадает с VB.NET Удвоение. Если вы запустите
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
с помощью .В СЕТИ вы обнаружите странности, аналогичные той, которую вы обнаружили при оценке XPath.
Итак, проблема заключается в ограниченной точности этого типа чисел в XPath 1.0 (или других языках), десятичное представление (например, 0.55) является конечным, но двоичное представление может и не быть. Если вам нужна более высокая точность, вам нужно подумать о переходе на XPath 2.0, который в настоящее время поддерживается только продуктами сторонних производителей, такими как Saxon 9 или XQSharp, там вы можете использовать тип xs: decimal вместо типа number.
Комментарии:
1. Отличное объяснение, Мартин, очень признателен! Похоже, мне, возможно, потребуется изучить обновление XPath 2.0.