static void Main()
{
float a = 0.001f;
for (int i = 0; i < 1000; i++)
{
a += 0.001f;
}
Console.Write(a);
}
Вывело: 1.0009907
Откуда взялась часть "9907", если должна была получится просто единица?
Прохожу шажками(проходы по циклу):
1. 0.002
2. 0.003
3. 0.004
4. 0.00500000035 - вот, что это такое?
5. 0.00600000052 - и сново
6. 0.00700000068 - и опять
Что это такое? Почему так происходит? Откуда берутся эти "лишние" числа?
Так же с double:
Думал избавлюсь от проблемы, ибо у double повышенная точность(обычно он как раз таки и используется при расчётах).
static void Main()
{
double a = 0.001;
for (int i = 0; i < 1000; i++)
{
a += 0.001;
}
Console.Write(a);
}
Вывело: 1.0010000000000006
Прохожу шажками(проходы по циклу):
1. 0.002
2. 0.003
3. 0.004
4. 0.005 - Оооо, тут уже всё нормально
5. 0.006 - и тут тоже
...
7. 0.0090000000000000011 - пошло, поехало! Опять!
Почему так происходит? Откуда берутся эти "лишние" числа?
Как это связано с двоичной системой счисления?(вроде, правильное понятие сказал, тут могу ошибаться)
Как эту проблему можно решить или как её можно избежать?
Как мне, например, если я после "такого" сложения хочу проверить, что вышло число 1, а вышла такая чупакабра? Явным преобразованием в целочисленный тип?