Visual Studio 2005 & C#
Вот простенький пример кода:
double a = 0.05;
double b = 0.006;
double c = a * b;
Останавливаю в режиме отладки и вижу, что c = 0.00030000000000000003. 20 знаков после запятой!!! Почему??? Ведь должно получиться 0.0003.... В чем дело, кто-нибудь может объяснить? Хотя для типа double в msdne четко сказано, 15 значащих цифр...
Это не благой интерес. Очень нужно, чтобы все было по нормальному...
Есть расчет очень сложного, циклического алгоритма. После каждой итерации данные (типа double) записываю в БД Access. При отладке по шагам в Visual Studio числа имеют длину 20 знаков после запятой, а при записи в Access они укорачиваются до 18 знаков... В принципе такая точность мне и не нужна, я бы ограничился 15 знаками. Но нужно делать "расчет с продолжением", т.е. нужно открывать файл БД, ранее расчитанный, из него считываю 2 последние строчки и продолжаю вычисления, основываясь на этих данных... Так вот эти считанные данные (ранее сохраненные) отличаются на 2 последних знака после запятой, поэтому расчет например 100.000 без продолжения (за раз) отличается от расчета например сначала 50.000, потом еще 50.000. Сначала разница ничтожна, но потом сказывается "лавинный эффект" и при большом количестве итераций разница уже существенна...
И это всё из-за того, что получается в примере выше такая фигня.
Из-за того, что в памяти хранится не 0.0003 а 0.00030000000000000003 постепенно накапливается ошибка...
Кто виноват и что делать?