Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > длинные числа double


Автор: Danzan 2.7.2011, 01:14
Привет. Делаю класс для систем счисления. Столкнулся с проблемой:
Код

double d=1001100011101000100111111010101100101001111.00000001; //как пример(с потолка)


при дебаге вижу следующее:

d=1.0011000111010001E42

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

Благодарю smile

Автор: newbieone 2.7.2011, 10:48
Если пример действительно с потолка и вам нужно только, чтоб число выводилось в другой форме, есть класс Formatter из java.util.
Код

double d=1001100011101000100111111010101100101001111.00000001;
print(d); // вывели в записи с 10 to the power
Formatter f = new Formatter(); // создали объект класса
f.format("%f",d); // задали формат вывода: %f - десятичное значение с плавающей точкой
print(f); // вывели в привычном виде

Вывод:
Код

1.0011000111010001E42 // 10 to the power
1001100011101000100000000000000000000000000,000000

Да, а то, что исходное число и его вывод на экран (в обоих формах записи) не совпадают, вас не смущает?

Автор: Danzan 2.7.2011, 16:35
Блин smile не понимаю, пробовал AFFFFFFFADDDDFFFF.AFFDFFFFDFFFFFEEFFFF перевести в двоичную, у меня на какомто этапе умирает с ошибкой:
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 smile как раз зашел отписаться что bigdecimal все решил и тут ваш ответ в тему.

BigDecimal поломал слегка мозг своей нестандартной арифметикой. Пока прикрутил как костыль, скорость работы упала в разы, нужно будет вылизывать код.

Автор: newbieone 3.7.2011, 10:41
Danzan, а как вы шестнадцатеричные дроби из своих постов в BigDecimal загоняли? 
Цитата
AFFFFFFFADDDDFFFF.AFFDFFFFDFFFFFEEFFFF

Автор: Danzan 3.7.2011, 13:05
Цитата(newbieone @ 3.7.2011,  10:41)
Danzan, а как вы шестнадцатеричные дроби из своих постов в BigDecimal загоняли? 
Цитата
AFFFFFFFADDDDFFFF.AFFDFFFFDFFFFFEEFFFF

никак, это класс для перевода в разные системы счисления, AFFFF.DFFFF как строка, дальше манипуляции с переводом и ответ в bigdecimal

Автор: Stolzen 3.7.2011, 17:44
Danzan, Он долго работает, и при каждой операции создается новый объект - отсюда потеря скорости. 
Для прироста скорости можно переписать BigDecimal под себя так, чтобы он был mutable. Это не составит большого труда (я когда-то переписывал, но у меня код не сохранился).

Еще можно посмотреть этот вопрос на форумах по спортивному программированию, там может получится найти готовую реализацию. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)