Проблемы с проверкой равенства два удваиваются в.NET — что случилось с этим методом?

Таким образом, я просто собираюсь погрузиться в эту проблему... У меня есть в большой степени используемое веб-приложение, которое, впервые за 2 года, отказавшее выполнение равенства проверяет два, удваивает использование функции равенства, коллега сказал, что также использовал в течение многих лет.

Цель функции, в которой я собираюсь вставить здесь, состоит в том, чтобы сравнить два двойных значения с 4 цифрами точности и возвратить результаты сравнения. Ради иллюстрации мои значения:

Dim double1 As Double = 0.14625000000000002 ' The result of a calculation
Dim double2 As Double = 0.14625 ' A value that was looked up in a DB

Если я передаю их в эту функцию:

Public Shared Function AreEqual(ByVal double1 As Double, ByVal double2 As Double) As Boolean

    Return (CType(double1 * 10000, Long) = CType(double2 * 10000, Long))

End Function

сбои сравнения. После умножения и броска Long, сравнение заканчивает тем, что было:

Return 1463 = 1462

Я - вид ответа на мой собственный вопрос здесь, но я вижу это double1 в точности двойного (17 цифр), и бросок работает правильно.

Мой первый реальный вопрос: Если я изменяю строку выше на следующее, почему она работает правильно (возвраты True)?

Return (CType(CType(double1, Decimal) * 10000, Long) = _
    CType(CType(double2, Decimal) * 10000, Long))

Не делает Decimal имейте еще больше точности, таким образом бросок Long должен все еще быть 1463, и возврат сравнения False? Я думаю, что у меня есть заскок на этом материале...

Во-вторых, если бы нужно было изменить эту функцию для создания сравнения, я ищу более точный или менее подверженный ошибкам, Вы рекомендовали бы изменить его на что-то намного более простое? Например:

Return (Math.Abs(double1 - double2) < 0.0001)

Был бы я быть сумасшедшим попробовать что-то как:

Return (double1.ToString("N5").Equals(double2.ToString("N5")))

(Я никогда не делал бы вышеупомянутого, мне просто любопытно на предмет Ваших реакций. Это было бы ужасно неэффективно в моем приложении.)

Так или иначе, если кто-то мог бы пролить некоторый свет на различие, я вижу между кастингом Doubles и Decimals к Long, это было бы большим.

Спасибо!

6
задан Cᴏʀʏ 5 August 2010 в 18:03
поделиться