Wyświetlany wynik a typ zmiennej

0

Witam,

Mam problem. Piszę kod do programu, który realizuje pewne obliczenia. W pętli zmiennej typu double po wykonaniu dzielenia zawsze przypisuje wyniki typu int choć z jedną liczbą po przecinku np: 9.0. Kod poniżej:

private double ObliczETPtUD()
       {
            double skladnik1;
            double skladnik2;
            double licznik;
            double mianownik;
            double ETPtU;
            double ETPtD;
            ObliczEP();
            EPt = 0;
            for (int i = 1; i <= LiczbaLinii; i++)
            {
            skladnik1 = p* i / (i + 1);
            licznik = (Silnia(LiczbaLinii) / (Silnia(i) * Silnia(LiczbaLinii - i))) * Math.Pow((1 / LKolAll), i) * Math.Pow((1 - (1 /  LKolAll)),(LiczbaLinii - i));
            mianownik = 1 - Math.Pow((1 - (1 / LKolAll)), LiczbaLinii);
            skladnik2 = licznik / mianownik;
            EPt +=  skladnik1 * skladnik2;
            }
            EPt +=  0.5; // wyzmaczome EPt
            ETPtU = (WysMo / 2 + (EPt - 1) * WysMo) / tUp;
            ETPtD = (WysMo / 2 + (EPt - 1) * WysMo) / tDown;
            ETPtUD = EP * (ETPtU + ETPtD);
            return ETPtUD;
        }

Dla przykładu zmienna skladnik1. Jest typu double. W pierwszej iteracji dla i=1 przyjmuje wartość 5.0 (p=10), w drugiej 6.0 zamiast 6.6666 itd. Czym to jest spowodowane i jak łatwo to poprawić.
Poza tym nie rozumiem dlaczego przy zapisie:

skladnik1 = p* (i / (i + 1)); 

zmienna skladnik1 daje wynik 0.0??

Bardzo proszę o jakieś sugestie...

0

"i" jest typu integer, dlatego i / (i+1) zawsze da Ci zero.

0

OK, w takim razie jakie powinno być i żeby pętla zwiększała się co jeden a wynik nie był zero.
No i oczywiście będę wdzięczny za odpowiedź na pierwsze z pytań...

0

Jak uzyskujesz wartość zmiennej zmienna1? Pod debuggerem, czy może po prostu jakoś to wypisujesz? Bo jeśli to drugie, to możliwe, że przed wypisaniem zaokrągla ci jakoś w dół.

0

hmmm nie wiem czy do końca rozumiem pytanie :(
Ale chyba pod debbugerem. Wykonywane jest pętla i w niej przypisywana wartość do zmiennej składnik1 będąca wynikiem działania p*i/(i+1)

0
kudlatyk napisał(a)

OK, w takim razie jakie powinno być i żeby pętla zwiększała się co jeden a wynik nie był zero.
No i oczywiście będę wdzięczny za odpowiedź na pierwsze z pytań...

Skoro pętla ma się zwiększać o 1, to i musi być 1, to chyba logiczne, prawda?

Ty nie manipuluj i, tylko wykonuj dzielenie na liczbach rzeczywistych, a nie całkowitych, czyli zamiast: skladnik1 = p* (i / (i + 1)); daj np.: skladnik1 = p* ((double)i / ((double)i + 1));

0

Dzięki za odpowiedzi.
Tak własnie zrobiłem. Zamiast rzutowania wprowadziłem kolejną zmienną i2, która na początku pętli jest i2=Convert.ToDouble(i); i wszędzie zamiast i podstawiam i2.
W tej chwili wszystko działa póki co. Dzięki za posty i poświęcony czas.
Pozdrawiam
Kudlatyk

1 użytkowników online, w tym zalogowanych: 0, gości: 1