Wątek przeniesiony 2017-10-02 11:04 z C# i .NET przez somekind.

Double, Float i Integer

0

Pytanie jest zapewne z gatunku trywialnych, jednak zadaje pytanie aby zrozumieć jak działa składnia c#...
Prosze o wybaczenie

Przykłąd 1.
Dane wsadowe to inty.
Operacje matematyczne wykonuję na zmiennych float.
Przy działaniu a = b + 0.5 wyskakuje bład konwersji.

Przykłąd 2:
Dane wsadowe to Inty. Operacje matematyczne wykonuję na zmiennych double.
Przy działaniu double a = (62/100) * 100 * 100 wynikiem jest a = 0

Oczywiście problemy rozwiązałem:

  1. wszystkie floaty zastąpiłem double
  2. dane wejściowe zadeklarowałem jako double

Byłbym wdzięczny gdyby ktoś naświetlił mi przyczynę błedów - dla mnie niezrozumiałych.

1

"Przy działaniu a = b + 0.5 wyskakuje bład konwersji.". Typy, 0.5 to float, a a b to integery, a csharp odmawia wykonywania operacji na różnych typach.
a = (62/100), a jest zerem, gdyż tak je Zadeklarowałeś, 62 i 100 to inty (literały tak zwane) i dzielenie w nich daje zero, więc kompilator sobie przyjął , że zadeklarowałeś mu double równe 0; byłoby 0.62, jakbyś Zrobił: a = (62.0/100).

0
lion137 napisał(a):

"Przy działaniu a = b + 0.5 wyskakuje bład konwersji.". Typy, 0.5 to float, a a b to integery, a csharp odmawia wykonywania operacji na różnych typach.

Tego nie rozumiem.
a i b jest zadeklarowane jako double, i wtedy to działa.
gdy podstawię a i b jako float to nie działa - dlaczego?
0.5 to przecież liczba zmiennoprzecinkowa, zarówno float, double jak i decimal ?

                float a = 0, b = 0;
                a = b + 0.5; //cannot implicitly convert 'double' to 'float'
1

Problem polega na tym, że stała (literał) 0.5 jest typu double. A operujesz na float. A C# nie lubi automatycznych konwersji pomiędzy typami. Zrób: 0.5f i wtedy masz 0.5, które jest floatem ;)

Tak samo masz w swoim drugim przypadku:

double a = (62/100) * 100 * 100

62 oraz 100 są stałymi typu int. Dzielenie int przez int jest całkowite, stąd 62/100 jest równe 0.

1

Wklej swój kod do visual studio. Gdy najedziesz myszka na zmienna badz literał, wyswietli ci sie jakiego jest typu. 0.5 domyslnie jest typu double a nie float. Double posiada wiekszą precyzje dlatego nie mozesz niejawnie skonwertowac to do float'a
A co do kodu, mozesz zrobic tak:

a = b + (float)0.5;

badz tak:

a =(float)( b + 0.5);
1

Zamiast rzutować lepiej zapisać literał z odpowiednim sufiksem: https://www.dotnetperls.com/suffix

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