| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > длинные числа double |
| Автор: Danzan 2.7.2011, 01:14 | ||
Привет. Делаю класс для систем счисления. Столкнулся с проблемой:
при дебаге вижу следующее: d=1.0011000111010001E42 есть вариант как работать с такими длинными дробями, чтоб основание не выводило? или лучшим вариантом будет сделать погрешность вычислений укоротив число и как это правильно реализовать на яве? Благодарю |
| Автор: newbieone 2.7.2011, 10:48 | ||||
Если пример действительно с потолка и вам нужно только, чтоб число выводилось в другой форме, есть класс Formatter из java.util.
Вывод:
Да, а то, что исходное число и его вывод на экран (в обоих формах записи) не совпадают, вас не смущает? |
| Автор: Danzan 2.7.2011, 16:35 |
| Блин java.lang.NumberFormatException: For input string: "0291418478875758E20". А если в десятичную ответ выдает "2.0291418478875758E20" пробовал на калькуляторе онлайн(http://math.semestr.ru/inf/index.php), решил как положено... как он справляется с такими длинными числами? посоветуйте вариант решения. Есть вариант как отловить это явление глбально? а не правит в каждой строчке кода, тк это чудо появляется и в ответе и на пути решения(возведение в степень итп) и приращивать костыль к каждой строке както не правильно... |
| Автор: Stolzen 2.7.2011, 22:23 |
| Используйте BigDecimal |
| Автор: Danzan 3.7.2011, 00:11 |
| Спасибо Stolzen BigDecimal поломал слегка мозг своей нестандартной арифметикой. Пока прикрутил как костыль, скорость работы упала в разы, нужно будет вылизывать код. |
| Автор: newbieone 3.7.2011, 10:41 | ||
Danzan, а как вы шестнадцатеричные дроби из своих постов в BigDecimal загоняли?
|
| Автор: Danzan 3.7.2011, 13:05 | ||||
никак, это класс для перевода в разные системы счисления, AFFFF.DFFFF как строка, дальше манипуляции с переводом и ответ в bigdecimal |
| Автор: Stolzen 3.7.2011, 17:44 |
| Danzan, Он долго работает, и при каждой операции создается новый объект - отсюда потеря скорости. Для прироста скорости можно переписать BigDecimal под себя так, чтобы он был mutable. Это не составит большого труда (я когда-то переписывал, но у меня код не сохранился). Еще можно посмотреть этот вопрос на форумах по спортивному программированию, там может получится найти готовую реализацию. |