Какой лучший способ сравнить целую часть двух нецелых чисел? - PullRequest
2 голосов
/ 25 октября 2008

Мне нужно сравнить целую часть двух двойных для неравенства, и я сейчас делаю это:

int iA = (int)dA;
int iB = (int)dB;

if( iA != iB )
{
    ...
}

но мне интересно, есть ли лучший подход, чем этот.

Спасибо.

Если бы я использовал Math.Truncate () вместо приведения к int, было бы все еще правильным сравнить два результирующих двойных значения на равенство?

О комментариях к венгерской нотации:

Я никогда не использую HN, по крайней мере, так, как это делает большинство людей. Но это один из тех редких случаев, когда семантика переменной напрямую связана с ее типом. Я мог бы выбрать другой синтаксис, такой как A_As_Integer и B_As_NonInteger, но в чем тогда разница?

Ответы [ 4 ]

7 голосов
/ 25 октября 2008

Использовать Math.Truncate (), т.е.

if (Math.Truncate(x) == Math.Truncate(y))

[Редактировать] Понял, что если вы сравниваете целочисленные части значений типа double, приведение к значениям int сначала создает риск переполнения, если ваши значения double находятся вне диапазона, который может быть представлен как int.

Truncate возвращает либо десятичное число, либо двойное, чтобы избежать этой проблемы.

4 голосов
/ 25 октября 2008

Да, это лучший подход.

Исходя из формулировки вашего вопроса, вы не беспокоитесь о округлении ... только сама целочисленная часть.

есть. (int) 4.1 даст тот же результат, что и (int) 4.9

Как сказал Овидий, если вам нужны только переменные для сравнения, вам нужно будет только привести удвоенные числа в операторе сравнения. Я смотрел только на теорию.

1 голос
/ 25 октября 2008

Я согласен, что Truncate - это то, что вы хотите.

Некоторая полезная информация от MSDN :

Truncate возвращает число, которое остается после удаления любых дробных цифр.

Округляется до ближайшего целого числа в направлении нуля.

double floatNumber;

floatNumber = 32.7865;
// Displays 32      
Console.WriteLine(Math.Truncate(floatNumber));

floatNumber = -32.9012;
// Displays -32       
Console.WriteLine(Math.Truncate(floatNumber));
1 голос
/ 25 октября 2008

Лично я стараюсь избегать создания дополнительных переменных, если они мне не нужны.

if ( (int)dA != (int)dB ) {
    ...
}

По мере того, как код эволюционирует с течением времени, наличие дополнительных переменных, висящих без всякой цели, приводит к путанице. Конечно, если вам нужны эти переменные, это другая проблема:)

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

if ( (int)ageA != (int)idB ) {
    ...
}

В этом случае, даже не зная, что это за данные, видение того, что вы пытаетесь сравнить «возраст» с «идентификатором», является хорошим признаком того, что здесь что-то не так.

...