Инкремент "For" не работает правильно.Зачем? - PullRequest
6 голосов
/ 28 июля 2011
for (float i = -1; i <= 1; i+=0.1f)   
{
    Console.WriteLine(i);   
}

Это результаты

-1
-0.9
-0.8
-0.6999999
-0.5999999
-0.4999999
-0.3999999
-0.2999999
-0.1999999
-0.09999993
7.450581E-08
0.1000001
0.2000001
0.3000001
0.4000001
0.5000001
0.6000001
0.7000001
0.8000001
0.9000002

Ответы [ 6 ]

4 голосов
/ 28 июля 2011

Потому что число с плавающей запятой - это не точное десятичное число, а число с плавающей запятой. Вместо этого используйте десятичную.

См. Википедию для справки: Википедия

2 голосов
/ 28 июля 2011
2 голосов
/ 28 июля 2011

Float и double не могут точно отображать десятичные значения. Посмотрите в википедии, как они реализованы.

Вместо этого вы можете использовать Decimal.

1 голос
/ 28 июля 2011

Используйте целые числа для целей индексации. И если вам нужны значения с плавающей точкой внутри цикла, рассчитайте их там:

for (int i = -10; i <= 10; i++)   
{
    Console.WriteLine(i / (float) 10);   
}
0 голосов
/ 28 июля 2011

Это из-за того, что вы используете числа с плавающей запятой. Вычисление чисел с плавающей запятой не совсем правильно, потому что ваш компьютер использует внутренние двоичные числа, а не десятичные числа. Хорошая информация об этой проблеме здесь: http://floating -point-gui.de /

0 голосов
/ 28 июля 2011

float представляет 32-битное число с плавающей запятой .Он не может точно представлять эти значения.Вот еще одна, обязательная к прочтению статья о плавающей запятой, специально для .NET: http://csharpindepth.com/Articles/General/FloatingPoint.aspx

...