![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| danilsl |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 78 Регистрация: 15.3.2006 Репутация: нет Всего: нет |
Вот примитивнейшая прога
и вот её результаты
Если запускать не в IDE, результаты теже. Откуда растёт эта потеря точности, ведь все числа с запасом влезают в разрядную сетку типа double |
||||
|
|||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Не влезают. 1.0011 как вы видите не влезает. Точное представление десятичного числа в двоичной форме не всегда влезает. Тут уже приводили пример, как например простая дробь 1/3 дает бесконечную дробь в десятичной форме 0.3(3). Аналогично при переходе из десятичной формы в двоичную.
|
|||
|
||||
| ALKS |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 354 Регистрация: 22.3.2006 Репутация: 1 Всего: 11 |
и сие справедливо для любых языков програмирования работающих с "реальными" простыми типами. так что не в Java дело
|
|||
|
||||
| YuG |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 20.2.2006 Репутация: нет Всего: 4 |
danilsl, думаю, это происходит из-за приведения типов.
Как побороть для FOR не понял. Вот так работает :)
|
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 4 Всего: 57 |
Да, да, да сам пару дней назад столкнулся с подобной проблемой.
Единственный выход который мне посоветовали округлять -------------------- менеджер по кодеврайтингу |
|||
|
||||
| carper |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 1 Всего: 8 |
Bulat
Можно так:
Вообще же, хотя это еще сильно зависит от бизнес-логики, лучше округлять конечный результат, а не промежуточные вычисления. Плюс стараться избегать операций с десятичными числами без реальной необходимости, хотя бы исходя из того, что, как тут уже говорилось, нормальная математика полагает, что 1/3+1/3+1/3 - это строго 1, а не нечто с периодами после запятой. Впрочем, для тех случаев, когда необходимы точные вычисления десятичных чисел с повышенной точностью существуют типы типа BigDecimal - они проблемы с представдлением десятичных чисел не удаляют, а просто решают разумным способом. Например, не судите за качество - писал, что в голову с ходу пришло:
|
||||
|
|||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
десятичное счисление - точно такая же математика, как и двоичное. И у ЛЮБОЙ системы счисления есть "слабые места". В этом плане десятичная ничуть не слабее двоичной/троичной/восьмиричной Другое дело, что в памяти сохраняется как двоичное.... Но. Большинство чисел в бизнес-уровне хотят и должны корректно оперировать десятичными(!) числами. Система, в разработке которой сейчас учавствую, все числовые значения из уровня бизнес-логики содержит в BigDecimal. Хотя он и громоздкий. -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| carper |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 1 Всего: 8 |
chief39,
В общем-то, сильно зависит от задачи. Большинство задач в моей практике было разумнее, проще и быстрей перевести на промежуточные операции с целыми числами или просто быть повнимательнее в расчетах погрешностей (а это чертовски неприятная задача отслеживать места накопления ошибки), в вашей, может все с точностью наоборот, кто знает. Я просто посоветовал уходить от десятичных дробей там, где это возможно - думаю довольно безобидный совет при правильном применении. Тот же BigDecimal не просто громоздкий, он еще очень медленный и порождает кучу объектов, т.е. казалось бы в тех областях, где больше всего желательны десятичные числа, сам BigDecimal вовсе не так уж желателен из-за вышеперечисленных недостатков.
Я бы сказал, что тут слабое место не в системе счисления, а в представлении чисел в компьютере. Просто надо с этим смириться. |
||||
|
|||||
| chief39 |
|
||||||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 15 Всего: 77 |
Это да
Вот-вот! Ещё куда ни шло копаться вечерком спокойно и дебажить прогу, но совсем другое - когда система, работающая с деньгами, начинает их где-то(!) терять. Причём найти это место, допустим, ещё не так страшно... А вот исправить неверные результаты сложных риалтайм расчётов на лету - это повешению подобно
Я вот иногда думаю.... Почему люди считали по 10 пальцам а не по двум рукам? Сколько проблем решилось бы... И почему в джаве нет просто Decimal... -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
||||||
|
|||||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 4 Всего: 57 |
2carper
В своем случае-то я разобрался, да и в принципе ты советуешь почти тоже, но лично в моем случае я сначала умножал на 1000, а потом округлял переводя в тип int из double, а потом снова делил на 1000 и снова в double. А про BigDecimal не юзал, но мне сказали пару серьезных причин почему не стоит его применять, если нет существенной необходимости -------------------- менеджер по кодеврайтингу |
|||
|
||||
| Metal_Heart |
|
|||
|
а почему бы и нет? ![]() ![]() Профиль Группа: Участник Сообщений: 728 Регистрация: 31.3.2005 Где: Москва Репутация: 4 Всего: 12 |
раз уж пошла такая пляска
вот нашёл небольшое описание: http://www.delphikingdom.com/asp/viewitem.asp?catalogID=374 Это сообщение отредактировал(а) Metal_Heart - 24.5.2006, 08:42 -------------------- не стыдно учиться, а стыдно не учиться |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |