2016-04-06 7 views
3

Betrachten Sie den folgenden Code ein:Endlose for-Schleife mit Schwimmer

for (float i = 0f; i < int.MaxValue; i++) 
{ 
    // Some code 
} 

Welche Schleife von 0 zu int.MaxValue soll (2 -1), aber es funktioniert nicht. Einmal i erreicht 2 , i++ funktioniert nicht mehr aus einem Grund, den ich völlig nicht verstehen kann.

In dem Direkt-Fenster von VS habe ich versuche dies:

>i 
16777216.0 
>i + 1 
16777216.0 // ??? 
>i == i + 1 
false // as expected, but a lack of consistency with upper statement 
>i + 2 
16777218.0 

Warum es wie so verhält? Was ist speziell mit 2 +1?

Antwort

13

Es ist wegen Schwimmer Genauigkeit. Es basiert auf dem IEEE-Standard für Gleitkommaarithmetik(). Lesen Sie es, um zu verstehen, wie Gleitkomma funktioniert.

In einfachen Worten, wenn ein Float einen großen Wert in sich speichert; Der Unterschied zwischen der aktuell gespeicherten Nummer und der nächsten Nummer, die gespeichert werden kann, ist größer als 1, also erhöht das Hinzufügen von 1 den Wert nicht.

Wenn Sie die genaue Dezimalzahl benötigen, verwenden Sie stattdessen decimal. Wenn Sie einen ganzzahligen Wert größer als int benötigen, verwenden Sie long. Wenn Sie sehr große Integralwerte benötigen, verwenden Sie BigInteger.