Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потеря точности при записи числа в БД, Числа double при записи в БД обрезаются 
:(
    Опции темы
mrHunter
Дата 21.7.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.7.2007

Репутация: нет
Всего: нет



Есть расчет очень сложного, циклического алгоритма. После каждой итерации данные (типа double) записываю в БД Access. Использую Visual Studio 2005 & C#. При отладке по шагам в Visual Studio числа имеют длину 20 знаков после запятой, а при записи в Access они укорачиваются до 18 знаков... В принципе такая точность мне и не нужна, я бы ограничился 15 знаками. Но нужно делать "расчет с продолжением", т.е. нужно открывать файл БД, ранее расчитанный, из него считываю 2 последние строчки и продолжаю вычисления, основываясь на этих данных... Так вот эти считанные данные (ранее сохраненные) отличаются на 2 последних знака после запятой, поэтому расчет например 100.000 без продолжения (за раз) отличается от расчета например сначала 50.000, потом еще 50.000. Сначала разница ничтожна, но потом сказывается "лавинный эффект" и при большом количестве итераций разница уже существенна...

Подскажите, пожалуйста, что мне лучше сделать? Обрезать числа после каждого вычисления? Какие еще варианты есть?

Заранее благодарен.
PM MAIL   Вверх
Idsa
Дата 21.7.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



mrHunter, к сведению: для вопросов по ADO.NET есть специальный раздел.

Какой тип поля используется в Access?

Добавлено через 11 минут и 27 секунд
И еще.
Вот выдержка из MSDN:
Цитата

By default, a Double value contains 15 decimal digits of precision

Так что в отладчике Вы обсчитались.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Idsa
Дата 21.7.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Сейчас проверил. Отладчик показывается 17 знаков после запятой.
В MSDN и про это написано:
Цитата

By default, a Double value contains 15 decimal digits of precision, although a maximum of 17 digits is maintained internally



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mrHunter
Дата 21.7.2008, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.7.2007

Репутация: нет
Всего: нет



Но я точно проверял, в отладчике 20 цифр.... Это точно! В Access то все-равно числа обрезанные приходят. Тив в Accessе - двойное с плавающей точкой...
PM MAIL   Вверх
Lomir
Дата 21.7.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 30.1.2007
Где: Lithuania::Kaunas

Репутация: нет
Всего: 1



Так ведь можно использовать строки для хранения чисел. А вопше если нужна такая большая точность и не совсем критична производителность, я тут лучше использовать длиную арифметику. Кстати есть еще такой тип как decimal (128 бит кажись), незнаю есть ли он в Access.
PM MAIL ICQ Skype   Вверх
Idsa
Дата 22.7.2008, 05:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(mrHunter @  22.7.2008,  00:24 Найти цитируемый пост)
Но я точно проверял, в отладчике 20 цифр

20 цифр после запятой? Не верю!
Скрины в студию.

Цитата(mrHunter @  22.7.2008,  00:24 Найти цитируемый пост)
Тив в Accessе - двойное с плавающей точкой... 

Тип double в Access соответствует типу double в .NET, и у него 15 цифр после запятой.

Это сообщение отредактировал(а) Idsa - 22.7.2008, 05:54


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mrHunter
Дата 22.7.2008, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.7.2007

Репутация: нет
Всего: нет



Вот скрин:

user posted image

Да реально, 20 цифр блин...
PM MAIL   Вверх
mrHunter
Дата 22.7.2008, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.7.2007

Репутация: нет
Всего: нет



А в Accesse тоже 18 цифр после запятой, а никак не 15...

user posted image
PM MAIL   Вверх
Idsa
Дата 22.7.2008, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



mrHunter, может, Вы все-таки используете не double, а decimal?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mrHunter
Дата 22.7.2008, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.7.2007

Репутация: нет
Всего: нет



decimal никогда не использовал. Только double. Использование decimal удвоит количество занятой памяти и снизит скорость работы...

Вариант конвертации double в строку перед записью в БД -- наверное снизит скорость работы существенно... Должно же быть решение с double...

Не может быть, не может быть... Какая-то фигня...
PM MAIL   Вверх
mrHunter
Дата 22.7.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 23.7.2007

Репутация: нет
Всего: нет



Вот пример простенький, когда в отладчике можно увидеть 20 знаков после запятой:

Код

double[,] a = new double[1, 1];
double[] b = new double[1];
     
a[0, 0] = 0.05;
b[0] = 0.006;
      
a[0, 0] = a[0, 0] * b[0];

PM MAIL   Вверх
Wanderer2019
Дата 22.7.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



Попробуй округлять значения при помощи Math.Round. Тут можно указать количество цифр после запятой. Хотя это наверное не многим лучше работой со string.

Это сообщение отредактировал(а) Wanderer2019 - 22.7.2008, 12:34
PM ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1087 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.