Почему 0.05 * 0.006 = 0.00030000000000000003?
От: Аноним  
Дата: 22.07.08 14:14
Оценка:
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 постепенно накапливается ошибка...

Кто виноват и что делать?
double типы данных
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.