2016-08-25 8 views
2

Я делаю вычисления с высокой точностью десятичной точности BigDecimal объектов.Преобразование большого десятичного в двойное без экспоненциального формата

Я использую стороннюю библиотеку, для которой требуется параметр в double. Когда я пытаюсь преобразовать это в double, я получаю значения в экспоненциальном формате вместо десятичных знаков.

BigDecimal 0.000035000000000 
Double 3.5E-5 
BigDecimal bd; 
BigDecimal(0.0000349999999995631583260546904057264328002929687500); 
bd= bd.setScale(15,BigDecimal.ROUND_CEILING); 

Log.i("bd","bd "+bd.toPlainString()); 
Log.i("bd","double"+bd.doubleValue()); 

Я нашел различные способы преобразования этого значения 3.5E-5, как правильно десятичного в точках, но только в формате String. В то время как мне нужно значение в двойном

Возможность получить без экспоненциальный строкового объекта Но не в двойной

DecimalFormat df = new DecimalFormat("#"); 
     df.setMaximumFractionDigits(16); 
     String test=df.format(bd,doubleValue()); 
     System.out.println("op2 "+test); 
     Double test1=Double.parseDouble(test); 
     System.out.println("op2 "+test1); 

ВЫВОД op2 0,000035 op2 3.5E-5

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

Refferred Ссылки

Format BigDecimal without scientific notation with full precission

Converting exponential value in java to a number format

Conversion from exponential form to decimal in Java

How to resolve a Java Rounding Double issue

Java BigDecimal without E

How to Avoid Scientific Notation in Double?

Мой вопрос отличается от этих ссылок, я не хочу, чтобы double как строка без экспоненты, а я хочу только в двойном формате.

РЕДАКТИРОВАТЬ

Если двойное значение, переданное в экспоненциальном формате, на основе НКА libary будет дополнительно выполнять вычисления для данного объекта, что приведет к inmore десятичных точек и большему экспоненциальному значения. Итак, я хочу передать простой double без E

+0

Я бы предположил, что это только печать значения, которое вызывает это. Значение является примитивным двойником. –

+1

@ScaryWombat Я проверил его, когда я отлаживаю также, двойной объект показывает значение в формате E –

+0

, если моя сторонняя библиотека ожидает примитивного двойника в качестве параметра, то это именно то, что вы даете им –

ответ

3

Вы, кажется, вводите в заблуждение double, 64-битное значение, в котором разные биты имеют разное значение с его строковым представлением.

Давайте примем значение 0.015625. Внутренне двойник представляется как 64 бита (я не знаю, какая комбинация битов, но в любом случае это не имеет значения).

Но представление строки зависит от настроек формата используемой библиотеки. Обратите внимание, что представления 0.015625 и 1.5625E-2 представляют собой то же самое двойное значение. Двойник не сохраняется как строка, он не содержит . или E, всего несколько бит. Сочетание этих битов формирует его реальную ценность, и это то же самое, независимо от того, как вы представляете его как строку.Если у вас есть другой формат, результатом может быть также 1.56E-2. Это означает, что код, который преобразует внутреннюю битовую комбинацию из double в строку, делает некоторое округление.

Для получения double от BigDecimal просто используйте bd.doubleValue(). Нет необходимости использовать промежуточное строковое представление, и это может даже нанести ущерб этому, потому что, если строковое представление выполняет некоторое округление, вы не получите наилучшего приближения значения в BigDecimal.

Итак, bd.doubleValue() - единственный правильный способ сделать это. Это не возвращает определенный формат, он просто возвращает double, который ближе всего к значению в BigDecimal.

И снова, не путайте тип double с тем, как он представлен в виде строки. Это разные вещи. A double является double является double, и это не сохраняется в виде строки, экспоненциальной или простой или округлой или любой другой.

На самом деле, BigDecimal.toString() и BigDecimal.toPlainString() также возвращают разные строковые представления того же BigDecimal. AFAIK, есть даже функция преобразования третьей строки, toEngineeringString(), которая дает вам еще одно строковое представление того же BigDecimal. Это похоже на double: различные выходные процедуры с разными аргументами возвращают разные строки для одного и того же значения.