2016-08-08 28 views
8

kod tutaj jest prosta, ale nie rozumiem wyniki:Wyniki odlewania mnożenia przez Float dają różne wyniki, jeśli Float jest najpierw zapisany w zmiennej?

float percent = 0.69f; 
int firstInt = (int)(percent*100f); 

float tempFloat = percent*100f; 
int secondInt = (int)tempFloat; 

Debug.Log(firstInt + " " + secondInt); 

Dlaczego firstInt 68 ale secondInt jest 69?

+0

dobre pytanie –

+0

https://dotnetfiddle.net/YMJExy - wynik to '69 69' .. – Blorgbeard

+0

Lokalna maszyna, otrzymuję wynik' 68 69'. – jdphenix

Odpowiedz

1

Wygląda na to, że kompilator zorientowali się wartość wyrażenia

percent*100f 

stosując podwójne matematyki, a zoptymalizowane dala obliczeń. Nie jest to dozwolone, gdy wyniki pośrednie są zapisywane w zmiennej zmiennoprzecinkowej.

Ponieważ .69 nie ma dokładnej reprezentacji w float lub w podwójnym, dwie reprezentacje "ziemia" po różnych stronach int: double jest nieco powyżej, a float jest nieco poniżej rzeczywistej wartości .69.

+0

To wydaje się być możliwą poprawną odpowiedzią, jestem zaskoczony, że kompilator myśli sensowną optymalizację dla obliczeń 'float' ma to zrobić jako "podwójne". Gdy tylko rażąco zmienia dane wyjściowe i nie ma żadnych kwestii sprzętowych (środowisko uruchomieniowe), ponieważ jest to po prostu umieszczenie wartości na wyjściu. Czy wiesz, dlaczego to robi? – starlight54

+0

Ah nie martw się, odpowiedź na moje pytanie jest w innych odpowiedziach z komentarzy, kompilator C# może z grubsza użyć większej precyzji, ilekroć chce, jeśli biorąc pod uwagę opcję, jak mówisz, przechowywanie jej jako 'float' uniemożliwia jej robiąc to. – starlight54

Powiązane problemy