Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > if (переменная==целое число), то


Автор: Ronnie 22.12.2009, 22:31
Подскажите, пожалуйста, как в C# реализовать следующее:
дана переменная, которая циклом на каждом шагу увеличивается на 0,1.
внутри цикла другая переменная, зависящая от первой.
как мне сделать так, чтобы тело цикла выполнялось только в том, случае, если вторая переменная - целое число? как я понимаю, нужно вложить "if", но с каким условием?

Автор: Heinzz 22.12.2009, 22:54
Цитата(Ronnie @  22.12.2009,  22:31 Найти цитируемый пост)
внутри цикла другая переменная, зависящая от первой.

выходит что вторая переменная с плавающей точкой, а никогда не целое. Нужно определить малое число и с его помощью определять "целое" ли число.

Автор: motorway 22.12.2009, 22:56
Может быть, поможет следующий пример:

Код

 string a = "11";
            int number;
            bool result = Int32.TryParse(a, out number);
            
            if (result) MessageBox.Show(number.ToString());


Если точка в числе есть, то это считается не целым. Для целых чисел дает "истину".

Автор: Oxy 22.12.2009, 23:01
Код

if ((int)a == b)

Автор: ZMaximI 22.12.2009, 23:02
Код

            double d = 12.00;
            if ((d - (int)d == 0))
            {
                MessageBox.Show("Дробная часть = 0, т.е. число - целое");
            }

Автор: Экскалупатор 22.12.2009, 23:03
))))))))))))))))))))) черт все опередили.

Добавлено через 1 минуту и 53 секунды
Oxy, самое верное!

Автор: Heinzz 22.12.2009, 23:05
Цитата(Oxy @ 22.12.2009,  23:01)
Код

if ((int)a == b)

Вы сравниваете только целую часть..

Автор: Экскалупатор 22.12.2009, 23:08
Heinzz, если я не ошибаюсь, автору нужно выяснить целое ли у него число. тут это и происходит

Добавлено @ 23:08
если b будет дробным условие не выполниться

Автор: Oxy 22.12.2009, 23:08
Heinzz, а что надо сравнивать?  smile 
Цитата(Ronnie @  22.12.2009,  22:31 Найти цитируемый пост)
если вторая переменная - целое число?

Код

double a = 1.1;
int b = 1;

if ((int)a == b)  {
 // вторая переменная - целое число
}

Автор: Heinzz 22.12.2009, 23:09
да, но (int)2.6 == 2

Автор: Oxy 22.12.2009, 23:11
или
Код

double a = 1.1;
if ((int)a == a)  {
 // переменная - целое число
}

Автор: Экскалупатор 22.12.2009, 23:12
Код

double d = 5.2;
            if (d == (int)d )
            {

            }


попробуй так. может будет понятнее

Добавлено через 47 секунд
блин, не успеваю писать...

Автор: Oxy 22.12.2009, 23:15
Цитата(Heinzz @  22.12.2009,  23:09 Найти цитируемый пост)
да, но (int)2.6 == 2 

извиняюсь, там я написал немножко не то  smile

Добавлено через 50 секунд
Цитата(Экскалупатор @  22.12.2009,  23:12 Найти цитируемый пост)
блин, не успеваю писать... 

я стараюсь smile 

Автор: Heinzz 22.12.2009, 23:17
Код

for (double i = 0; i < 5; i += 0.1)
            {
                if ((int)i==i)
                {
                    Console.WriteLine(i);
                }
            }


 smile 

Автор: tol05 22.12.2009, 23:26
Код

for (double d = 0; d < 10; d = Math.Round(d, 1) + 0.1)
{
    if (d%1 == 0)
    {
        //цикл не выполняем
        continue;
    }
    //выполнение необходимых операций
}
если от d зависит ("как-то") другая переменная (например v) - то соответственно проверяем if (v%1 == 0)

Heinzz, сколько раз в консоли было написано i? У меня - 1 раз. 
"0.0"

)

Автор: Oxy 22.12.2009, 23:34
Код

for (int i = 0; i < 10 ++i) {
    for (double j = i; j < i+1; j += 0.1)  {
      // код
    }

    // тут код для целого числа
}


ещё вариант smile 

Автор: tol05 22.12.2009, 23:43
почему никто кроме меня не обрабатывает ошибки округления? 
)) 
+0.1 практически через раз дает 0.99999999997  или 3.99999999989 и т.п.

Автор: Heinzz 23.12.2009, 17:29
Цитата(tol05 @  22.12.2009,  23:43 Найти цитируемый пост)
почему никто кроме меня не обрабатывает ошибки округления? 
)) 
+0.1 практически через раз дает 0.99999999997  или 3.99999999989 и т.п.


вот это и главное! Все методы верны теоретически, но только если компьютер округляет верно, а это он делать никогда не будет. 
Я уже писал что нужно определиться с точностью сравнения.

Код

 for (double i = 0; i < 5; i += 0.1)
            {
                if (Math.Round(i, 2) == Math.Round(i,0))
                {
                    Console.WriteLine(i);
                }
            }

этот код работает

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)