none
Не могу поделить одно число на другое. RRS feed

  • Вопрос

  • Студент хочет спросить матерых дяденек по C#:

    В структуре Element три поля float: Qt, Qd, и Cq;

    В программе создан массив Element El[,] = new Element[100,100];

    где-то далее написано:

    El[i,j].Cq = El[i,j].Qd / El[i,j].Qt;

    Если Qd<Qt - результат всегда равен 0. Гоняю в отладчике, смотрю watch.

    перед операцией El[1,1].Qt==30, El[1.1]Qd==20, El[1,1].Cq==0.0, после — тоже.

    float z = El[i,j].Qd / El[i,j].Qt; — тоже самое z==0; Исследования показали, что деление только целочисленное.

    Только {float x = El[i,j].Qd;     float y = El[i,j].Qt;      El[i,j].Cq = x / y;} и помогло.  В чем дело?! Я чуть не двинулся!

    использую скачанный три дня назад с оф сайта Visual C# express 2010.


    • Изменено Павел М 6 апреля 2011 г. 13:41
    • Перемещено Abolmasov Dmitry 22 апреля 2011 г. 11:35 (От:Настольные ПК)
    6 апреля 2011 г. 12:04

Ответы

  • Вообще, если у вас поля структуры float, то деление не должно быть целочисленным, а должен получатся нормальный дробный результат:

        static void Main(string[] args)
        {
          Element[,] El = new Element[100, 100];
          El[0, 0] = new Element();
          
          El[0, 0].Qt = 30;
          El[0, 0].Qd = 20;
          El[0, 0].Cq = 0;
    
          float z = El[0, 0].Qd / El[0, 0].Qt;
          float z2 = El[0, 0].Qt / El[0, 0].Qd;
          
          Console.WriteLine(z);
          Console.WriteLine(z2);
        }
    
        struct Element
        {
          public float Qt, Qd, Cq;
        }
    

    Получим:

    0,6666667
    1,5

     


    Для связи [mail]
    • Помечено в качестве ответа Павел М 7 апреля 2011 г. 10:43
    7 апреля 2011 г. 9:58

Все ответы

  • Структура это value тип. Для того, чтобы работать с её членами в циклах (и т.п.) нужно "извлекать" значение из структуры, что вы собственно и делаете - {float x = El[i,j].Qd;     float y = El[i,j].Qt;      El[i,j].Cq = x / y;}

     

    P.S. Если хотите работать непосредственно с членами Element, сделайте его классом

    6 апреля 2011 г. 12:14
  • Посмотрите топик int/int - как результат здеать float?. Не забудьте отметить решение проблемы с помощью кнопки "Пометить как ответ".
    Для связи [mail]
    6 апреля 2011 г. 12:43
  • Ну, классом у меня воспользоваться не получилось с массивом объектов я не управился, видимо придется "извлекать". Просто как то неожиданно — с умножением(сложением вычитанием) прокатывает, а на делении - взбрыкивает. Напрямую c=a*b — все ОК. И ладно бы ошибку выдавал — заменяет втихую нормальное деление целочисленным, этож еще вычислить надо! Все равно, большое спасибо.
    6 апреля 2011 г. 13:13
  • Вообще, если у вас поля структуры float, то деление не должно быть целочисленным, а должен получатся нормальный дробный результат:

        static void Main(string[] args)
        {
          Element[,] El = new Element[100, 100];
          El[0, 0] = new Element();
          
          El[0, 0].Qt = 30;
          El[0, 0].Qd = 20;
          El[0, 0].Cq = 0;
    
          float z = El[0, 0].Qd / El[0, 0].Qt;
          float z2 = El[0, 0].Qt / El[0, 0].Qd;
          
          Console.WriteLine(z);
          Console.WriteLine(z2);
        }
    
        struct Element
        {
          public float Qt, Qd, Cq;
        }
    

    Получим:

    0,6666667
    1,5

     


    Для связи [mail]
    • Помечено в качестве ответа Павел М 7 апреля 2011 г. 10:43
    7 апреля 2011 г. 9:58
  • Да, такая программа с прописанной переменной z прекрасно работает, спасибо.

    А вот такая

    E[0,0].Cq = El[0, 0].Qd / El[0, 0].Qt;
    

    работает, но с ошибкой.

    Вот я и подумал, пусть будет топик, вдруг кто еще столкнется, а поиск MDSN ему и поможет.

    7 апреля 2011 г. 10:46