2016-05-04 19 views
6

Ho questo codice;Variabile che agisce in modo strano (come in virgola mobile)

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

output è: 0

Ma questo codice restituisce diverso

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

output è: 1

Anche io ho questo codice

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

output è: 1

Guardo all'output di IL e non capisco perché C# esegue questa operazione matematica in fase di compilazione e di output diversi? enter image description here

Qual è la differenza di questo codice due? Perché ho deciso di usare il risultato variabile sta cambiando?

+0

Come si controllano i valori? – dotctor

+0

Possibile duplicato di [La matematica in virgola mobile è rotta?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Liam

+3

Mi guardavo intorno in una SO, ma non riesco a trovare la risposta esatta Questa risposta, tuttavia, potrebbe chiarire un po 'le cose: http://stackoverflow.com/a/15117741/2594485 –

risposta

2

Perché il compilatore ti inganna. Il compilatore è abbastanza intelligente da fare un po 'di matematica, quindi non ha bisogno di farlo in fase di esecuzione, il che sarebbe inutile. L'espressione 100 * .01f viene calcolata nel compilatore, senza la mancanza di precisione sul float, che è breaks you up on run-time.

Per provare questo, provare a fare il static test a const. Vedrai che il compilatore è in grado di fare anche i calcoli per te in fase di compilazione. Non ha nulla con la scrittura di una variabile prima, come nel tuo esempio. Tempo di esecuzione vs. tempo di compilazione.

+0

Ok, ho capito.Ma questa non è la mia domanda.Mi capisco.Compiler risolvendo le operazioni matematiche costanti al momento della compilazione. Questo è davvero necessario. Ma se io uso variabili per questa operazione "risultato" sta cambiando? Penso che sia sbagliato? Perché il risultato sta cambiando. Le variabili sono solo un segnaposto, ho ragione? – Cevizli

+0

No. Esiste una differenza tra la risoluzione del tempo di compilazione dei valori costanti e la rappresentazione runtime. –