Это сводится к общему подходу, который вы должны использовать при работе с числами с плавающей точкой в вычислениях.Не следует использовать сравнение на равенство с числами с плавающей запятой, например if a == b
, но всегда сравнивайте их с некоторой точностью эпсилона, которая имеет смысл в вашей прикладной области, например if abs(a-b) < 1e-8
.
Это концептуально аналогично выполнению некоторыхнетривиальные вычисления, например:
double a = 2.0;
a = sqrt(a);
a = a*a;
и последующее ожидание, что if a == 2.0
вернет истину вместо записи if abs(a-2.0) < 1e-8
.
Представлена точка геометрии в SQL Serverв виде чисел с плавающей точкой, которые не являются точными.
DECLARE @intersectionPoint geometry = @a.STIntersection(@b)
вычисляет точку пересечения с максимальной точностью, но она никогда не будет точной.
Итак, выражение типа @b.STIntersects(@intersectionPoint)
концептуально эквивалентно равенству сравнения.Это эквивалентно if @b.STDistance(@intersectionPoint) == 0
, что будет верно только в нескольких особых случаях.
Вместо этого следует использовать что-то вроде @b.STDistance(@intersectionPoint) < 1e-8
.