Таким образом, я просто собираюсь погрузиться в эту проблему... У меня есть в большой степени используемое веб-приложение, которое, впервые за 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")))
(Я никогда не делал бы вышеупомянутого, мне просто любопытно на предмет Ваших реакций. Это было бы ужасно неэффективно в моем приложении.)
Так или иначе, если кто-то мог бы пролить некоторый свет на различие, я вижу между кастингом Double
s и Decimal
s к Long
, это было бы большим.
Спасибо!