Странные результаты от функции потолка xquery - PullRequest
2 голосов
/ 25 мая 2011

Я работаю над приложением 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 Ответ

4 голосов
/ 25 мая 2011

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: вместо числового типа.

...