2016-05-04 10 views
6

Mam ten kod;Dziwnie działające dziwne (jak zmiennoprzecinkowe)

static int test = 100; 
     static int Test 
     { 
      get 
      { 
       return (int)(test * 0.01f); 
      } 
     } 

wyjściowy: 0

Ale ten kod zwraca inny

static int test = 100; 
    static int Test 
    { 
     get 
     { 
      var y = (test * 0.01f); 
      return (int)y; 
     } 
    } 

wyjście: 1

Również mam ten kod

static int test = 100; 
    static int Test 
    { 
     get 
     { 
      return (int)(100 * 0.01f); 
     } 
    } 

wyjście jest: 1

Patrzę na wyjście IL i nie rozumiem, dlaczego C# robi tę operację matematyczną w czasie kompilacji, a wynik jest inny? enter image description here

Czym różnią się te dwa kody? Dlaczego zdecydowałem się na zmianę wyniku zmiennej?

+0

Jak sprawdzić wartości? – dotctor

+0

Prawdopodobny duplikat [Czy matematyka zmiennoprzecinkowa jest zepsuta?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Liam

+3

Szukałem SO, ale nie mogę znaleźć dokładna odpowiedź. Ta odpowiedź może jednak trochę wyjaśnić: http://stackoverflow.com/a/15117741/2594485 –

Odpowiedz

2

Ponieważ kompilator cię wyśmiewa. Kompilator jest na tyle sprytny, że wykonuje już trochę matematyki, więc nie musi tego robić w czasie wykonywania, co byłoby bezcelowe. Wyrażenie 100 * .01f jest obliczane w kompilatorze, bez braku precyzji na pływaka, który jest breaks you up on run-time.

Aby to udowodnić, spróbuj zrobić static test a const. Zobaczysz, że kompilator jest w stanie wykonać dla Ciebie matematykę również w czasie kompilacji. Nie ma nic z pisaniem do zmiennej najpierw, jak w twojej próbce. Czas wykonywania w porównaniu do czasu kompilacji.

+0

Ok Rozumiem. Ale to nie jest moje pytanie. Dostaję to. Kompilator rozwiązuje stałe operacje matematyczne w czasie kompilacji. To naprawdę musi być. Ale jeśli używam zmiennych do tej operacji "wynik" się zmienia? Myślę, że to źle? Dlaczego wynik się zmienia. Zmienne to tylko symbol zastępczy? – Cevizli

+0

Nie. Istnieje różnica między rozdzielczością czasu kompilacji wartości stałych i reprezentacją czasu wykonywania. –

Powiązane problemy