![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| FREEDEV |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 6.3.2007 Где: Украина->Одесс а Репутация: 1 Всего: 3 |
Добрый день!
Возникла проблеммка с double. Операции умножения, деления приводят к появлению лишних знаков после запятой, например: 3*0.01 возвращает что, то вроде 0.030000001 5*0.02 = 0.0499999998 Немогу разобраться в чем дело, может кто встречался с подобным --------------------
Microsoft Windows Visla © |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
дело в машинном представлении чисел с плавающей запятой в компьютере.
погугли, там все очень неплохо написано.... вкратце : потому что компьютер сохраняет число как 2^М -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Интересно сколько миллионов раз этот вопрос задавался?
P.S. FREEDEV, открой для себя округление... -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| Lycifer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 4.11.2007 Репутация: нет Всего: нет |
округление хорошо ну вот если нужно посчитать точное значение?
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Округлять по-разному можно, например до 8-го знака после запятой.
-------------------- ![]() |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Точные значения в обыкновенных дробях считаются, а не в десятичных, это ещё в 5-ом классе средней школы проходят, тут даже механизмы хранения вещественных чисел в памяти компьютера непричём...
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| amarenkov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
Можно еще при расчетах использовать преобразование в другую систему счисления. В моем проекте, например, в одном месте из-за таких же проблем используются вычисления над 64-разрядными целыми числами. Правда это не я делал, но автор уверяет, что избавился от многих проблем |
|||
|
||||
| Lycifer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 4.11.2007 Репутация: нет Всего: нет |
Нет округление не пойдёт, просто сдесь приведёт пример когда значение уменьшается(то и есть его нужно увеличить), бываю сдучаи года 123.00000017
послу огругления будем иметь 123.0000002, ну или 123.0000001, а когда прибавим 0.00000001 будет совсем другое значения вобщемто очень приблезительное, единственное что вижу, так это то что можно реализовать класс, но он будет совсем не производителен!! |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Lycifer, используй тип decimal.
Это сообщение отредактировал(а) Дрон - 6.5.2008, 13:19 -------------------- Да. Именно так. |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
не бывает таких случаев, если ты их сам специально не создаёшь, так что не гони...
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Дрон, только вот тормознутый он, этот decimal, жутко...
А так конечно если бывает что вылезет погрешность, нужно её округлять. Других вариантов нет, AFAIK. -------------------- ![]() |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Ну так про требования к быстродействию автор ничего не сказал Это сообщение отредактировал(а) Дрон - 6.5.2008, 19:28 -------------------- Да. Именно так. |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Как же нет, я уже ещё 1 вариант назвал - вычисление в обычных дробях, так практически все математические пакеты поступают и никаких проблем с погрешностями не знают... другой вопрос, что это на много порядков более сложная задача, чем простое округление...
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
не все числа представляются в виде обыкновенных дробей.... и такая задача становится еще сложнее)
и мат пакеты страдают порой и очень сильно от погрешности... сам один раз попал на это в матГаде.. тогда как Maple посчитал лучше (ну а руками так вообще хорошо посчиталось)).... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Ну я Maple имел в виду, остальными я практически не пользуюсь... А Maple как раз на аналитических расчётах специализируется теоретически все. Другое дело что число может представлять собой бесконечный ряд обыкновенных дробей и даже не один, а также в состав дробей могут входить любые арифметические операции(+ - * / ^), ну да ленивые вычисления никто не отменял... P.S. Ну и в конечном итоге, можно посмотреть чему примерно равен полученный в виде громадной дроби результат, и тут за дело вновь берётся округление... -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |