Будь осторожен. Похоже, вы хотите определить Равные, чтобы значения в пределах определенного допуска считались равными. Если вы сделаете это, Equals не будет транзитивным, но для работы словаря он должен быть транзитивным.
Пример: предположим, что x меньше y в 0.8 раза больше допуска. Они будут считаться равными. Теперь рассмотрим значение z, которое больше y в 0,8 раза больше допуска. Поэтому y и z также равны. Но x и z не равны!
GetHashCode должен возвращать одинаковое значение для двух одинаковых объектов. Поскольку равенство не транзитивно в этой системе, вы можете доказать, что GetHashCode должен возвращать одно и то же значение для всех объектов, что приводит к тому, что ваш словарь действует как связанный список (но с дополнительными затратами на хранение, который теряется ).
Вы можете решить эту проблему, округлив все точки с определенной степенью точности и вычислив как хэш-код, так и равенство из округленного значения. Конечно, у такого подхода могут быть свои подводные камни.