2008-10-25 5 views
2

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

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

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

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

Спасибо.

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

О Hungarian Комментарии обозначения:

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

ответ

7

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

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

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

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

4

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

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

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

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

+0

Вопрос: что означает (int) -4.1 перейти к? – biozinc 2008-10-25 12:37:48

+0

Он будет равен -4 – Inisheer 2008-10-25 12:39:05

1

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

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

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

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

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

+0

+5 для избежания дополнительных переменных и еще 5 бонусных очков за упоминание первоначального намерения венгерской нотации (с использованием семантических, а не префиксных типов). – OregonGhost 2008-10-25 12:38:30

1

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

Некоторые полезные сведения из MSDN:

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

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

double floatNumber; 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^