сравнить разные числовые типы (int, float, double) в .NET

У меня есть функция, которая принимает два параметра и возвращает истину, если они равны, или ложь, если они не равны:

private bool isequal(object a, object b)
{
    if (a != null)
        return a.Equals(b);
    if (b != null)
        return b.Equals(a);
    //if (a == null && b == null)
        return true;
}

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

Например:

int a = 15;
double b = 15;
if (isequal(a,b)) //should be true; right now it's false
{ //...
}

Я уже нашел аналогичный вопрос (с ответом) лучший способ для сравнения double и int, но a и b могут быть числами любого типа или чем-то еще, кроме чисел. Как я могу проверить, являются ли a и b числами вообще? Я надеюсь, что есть способ лучше, чем проверка всех существующих числовых типов .net (Int32, Int16, Int64, UInt32, Double, Decimal, ...)

// обновление: мне удалось написать метод, который работает очень хорошо. Однако могут возникнуть проблемы с числами типа decimal (еще не тестировал). Но он работает для любого другого числового типа (включая большое количество Int64 или UInt64). Если кому-то интересно: код для равенства номеров


person Preli    schedule 24.08.2011    source источник
comment
Я думаю, вы пытаетесь сделать невозможное. Как вы можете сравнить Int64.MaxValue с float или double и ожидать достижения равенства. Недостаточно точности.   -  person David Heffernan    schedule 25.08.2011
comment
Я этого не ожидал. Int64.MaxValue и некоторое значение с плавающей запятой, конечно, никогда не будут равны. Но я ожидаю, что он будет работать правильно для всех возможных комбинаций (Int64.MaxValue! = Int64.MaxValue-1 является одной из них)   -  person Preli    schedule 25.08.2011


Ответы (2)


Вы можете использовать Double.TryParse как для a, так и для b. Он будет обрабатывать int, long и т. Д.

private bool isequal(object a, object b)
{
    if (a == null || b == null)
        return (a == b);

    double da, db;
    if (Double.TryParse(a.ToString(), out da) && Double.TryParse(b.ToString(), out db))
        return YourIsDoubleEqualEnough(da, db);

    return false;
}
person Donald    schedule 24.08.2011
comment
Код Double.TryParse будет достигнут только в том случае, если оператор AND b равен нулю, что приведет к исключению NullReferenceException! - person Preli; 24.08.2011
comment
Ты прав. Я изменил нулевую проверку в приведенном выше коде, чтобы отразить это. - person Donald; 30.08.2011

попробуй это

private bool isequal(object a, object b)
{
int c,d;
        if (int.TryParse(a.ToString(), out c) && int.TryParse(b.ToString(), out d))
        {
            if (c == d)
                return true;
        }
if (a != null)
    return a.Equals(b);
if (b != null)
    return b.Equals(a);
//if (a == null && b == null)
    return true;
}
person Blazen    schedule 24.08.2011
comment
Это приведет к возникновению исключения NullReferenceException, если a или b равны нулю (из-за a.ToString ()). Это также не будет работать, если a - int, а b - float или decimal. - person Preli; 24.08.2011