Какой наилучший способ сравнить целую часть двух нецелых чисел?

StackOverflow https://stackoverflow.com/questions/236323

  •  04-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Спасибо.

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

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

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

Это было полезно?

Решение

Используйте математику.Усекать(), т.е.

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

double floatNumber;

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

floatNumber = -32.9012;
// Displays -32       
Console.WriteLine(Math.Truncate(floatNumber));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top