Есть ли пакет, который реализует очень большие, высокоточные числа? - PullRequest
0 голосов
/ 23 октября 2011

Я обнаружил, что мне нужно вычислять большие числа с высокой точностью.Например: 5422300,8452.Каков наилучший способ хранения этих данных, чтобы на них могли воздействовать простые арифметические операторы?Я пытался сделать комбинации длинных и двойных, но это усложняется после значительного количества вычислений.Я уверен, что есть простое решение, я просто еще не настолько осведомлен.

Хорошо. В общем, я понял это: моя проблема заключалась в том, что я хотел сохранить точность до 4 десятичных знаков, но при вводе большого числа началось усечение цифр.Например, у меня было это:

Double Remain = (double) Math.round((double quantity/12)*10000)/10000;

Это работает для меньших чисел, но 900000000 все еще усекается до 7,5 чего-то.

Так что мне нужно разделить числа на длинныемодуль 2 и разделите его на знаменатель, и округлите результат.Затем добавьте 2.

Это работает!

Ответы [ 3 ]

6 голосов
/ 23 октября 2011

BigInteger и BigDecimal - это классы, которые вы ищете.Вы не сможете использовать простые арифметические операторы, потому что перегрузка операторов не существует в Java.Но у этих классов есть необходимые методы для всех простых операций.

1 голос
/ 23 октября 2011

Я не уверен, что понимаю ваш дополнительный вопрос, но для разделения код может выглядеть следующим образом:

BigDecimal x = new BigDecimal(45);
BigDecimal y = new BigDecimal(12);
BigDecimal result = x.divide(y);

Это обратная сторона, описанная JB Nizet, операторы использовать нельзятак что

BigDecimal x = new BigDecimal(45);
BigDecimal y = new BigDecimal(12);
BigDecimal result = x/y;

не будет работать.

0 голосов
/ 24 октября 2011

Хорошо. В принципе, я понял это: Моя проблема заключалась в том, что я хотел сохранить точность до 4 десятичных знаков, но при вводе большого числа началось усечение цифр. Например, у меня было это:

Double Remain = (double) Math.round((double quantity/12)*10000)/10000;

Это работает для меньших чисел, но 900000000 все еще усекается до 7,5 чего-то.

Так что мне нужно разделить числа на длинные а затем возьмите модуль 2 и разделите.

Возможно, это помогло бы, если бы объяснил цель того, что я пытался сделать. Я хотел, чтобы код отображал определенное количество значащих цифр. Если я использую Double в качестве переменной для хранения пользовательского ввода, которое нужно разделить, многие цифры могут быть усечены (в зависимости от количества получаемых десятичных знаков). Мне нужен был способ стандартизировать область действия переменной в целых числах, сохраняя при этом числа с точностью до 4 десятичных знаков.

Другими словами, мне нужно иметь возможность обрабатывать одно и то же число, независимо от того, сколько десятичных разрядов занимает частное.

Для этого я беру пользовательский ввод и делю его на литерал (12). Затем я беру модуль таким же образом и делю модуль на 12. Затем я собираю 2 вместе так:

Quotient.toString() + Remainder.toString().substring(1)
...