![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Отнимаю от одного double value другое. Затем определяю, результат получился большим, меньшим или равным 0. Проблема в том, что при вычитании одинаковых double-чисел получается не всегда 0, а +0.0000... или -0.0000.... Пока выкрутился так, что сравниваю результат вычитания не с 0, а с некой погрешностью:
Но сдается мне, это костыль. Может, кто поделится лучшим способом? Спасибо! -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
danilych |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 2.2.2011 Репутация: 3 Всего: 3 |
тип double не стоит использовать для точных вычислений - используйте BigDecimal
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
гм. а чем плох double?
Добавлено через 7 минут и 29 секунд уточню: что вы понимаете под точными вычислениями? и нужно ли ТС именно это, учитывая оверхед BigDecimal... |
|||
|
||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
К сожалению, код не мой. Надо пользоваться тем, что есть. Поясню. Вот, я задал погрешность 0.000001, а разность получилась, к примеру, 0.0000001, т. е. не 0, а мой код это примет за 0. Конкретно для моего ТЗ Точные вычисления не суть важны, моего костыля хватит. Мне интересно, решаема ли данная проблема с double в принципе, или в подобных случаях корректно использовать только BigDecimal? -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
в принципе все примерно так, как вы и делаете. т.к. double по определению не является точным значением, все сравнения нужно производить с учетом погрешности. обычно это делают в виде
можно написать функции сравнения. это не костыль, это следствие представления double в компьютере Добавлено через 8 минут и 12 секунд Pawl, если расчеты финансовые, то BigDecimal удобнее, т.к. автоматически производит округление по одному из правил (в т.ч. банковское). А производительность вычислений в бухгалтерских расчетах обычно не является критичным параметром. |
|||
|
||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
ОК, учту на будущее. Всем спасибо. -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Вообще говоря поймать +-0 в double можно, нашел этот прием а коде Arrays.
Правда судя по тексту и +0 и -0 таки равны просто 0. Нужно будет проверить. Это сообщение отредактировал(а) Mirkes - 12.11.2013, 23:57 -------------------- Mirkes |
|||
|
||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
проблема в том, что иногда double - такой же double дает не +-0, а, к примеру, -5.551115123125783E-17. В таком случае ваш пример не поможет... При выводе на экран, от "страшных" чисел и ненужных минусов я нашел способ избавиться при помощи методов класса java.text.NumberFormat. Это сообщение отредактировал(а) Pawl - 12.11.2013, 22:57 -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
||||
|
||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
А вот это уже говорит о том, что это не совсем одинаковые double ![]() Если Вас интересуют double равные с заданной точностью, то Ваше решение с введением некоего эпсилон единственно возможное. Хотя, пожалуй еще возможно сравнение по относительной величине:
Такой относительный подход предпочтительнее если Вы заранее не знаете порядка величин, поскольку если у Вас два числа порядка единицы дают разницу порядка 10^-15, то если Вы умножите оба своих числа на 10^20, то разность будет порядка 10^5. -------------------- Mirkes |
|||
|
||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Да, хорошая мысль! -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |