2016-04-06 4 views
3

Рассмотрим следующий код:Бесконечный цикл с поплавком

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

который, как предполагается петлю из 0 к int.MaxValue (2 -1), но это не так. Как только i достиг 2 , i++ больше не работает по той причине, что я совершенно неспособен понять.

В Immediate Окно VS Я стараюсь это:

>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 

Почему он ведет себя, как так? Что особенного с 2 +1?

ответ

13

Это из-за поплавка точности. Он основан на стандарте IEEE для арифметики с плавающей точкой (IEEE 754). Прочтите его, чтобы понять, как работает плавающая точка.

Простыми словами, когда поплавок хранит большое значение сам по себе; разница между текущим сохраненным номером и следующим номером, который он может сохранить, больше 1, поэтому добавление 1 к нему не увеличивает его значение.

Если вам нужно точное десятичное число, используйте вместо этого decimal.
Если вам нужно интегральное значение больше, чем значение int, используйте long.
Если вам нужны очень большие интегральные значения, используйте BigInteger.

Смежные вопросы