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