2015-04-13 2 views
0

Я работаю над программой калькулятора на Java, и мне нужно отобразить число длиной не более 15 цифр (включая десятичную точку).Форматирование двойного числа в java

Я пытался отформатировать этот номер, используя String.format("%g", myDouble), также с %f, но не могу получить результат, который я ищу.

Дело в том, что мне нужен номер:

  • будет отображаться в научной нотации, если она имеет более чем 15 цифр,
  • или отобразить без округления, если у него меньше 15 цифр.

Кроме того, я не хочу фиксированного количества цифр до или после десятичной точки.

Любые предложения?

Это код snipet где получает отображается мой номер:

if (("" + myDouble).length() > 15) { 
    screen.setText(String.format("%g", myDouble)); 
} else { 
    screen.setText("" + myDouble); 
} 

Одна проблема заключается в том, что, когда пункт else выполняется, иногда цифры которые будут отображаться в 9.0000E7, что не выгодно и отличается от String.format("%g", myDouble) научная нотация, которая больше похожа на 9.000e+7.

+0

Вы пробовали класс DecimalFormat? https://docs.oracle.com/javase/tutorial/java/data/numberformat.html (внизу страницы) – Shervin

+0

Можете ли вы прояснить: каково поведение округления, которое вы хотите для научной нотации? (Также должно быть ограничено до 15 цифр ...?) – Radiodef

+0

Подсказка: говорить, что 'n'" имеет более 15 цифр "- это то же самое, что сказать« Math.abs (n)> = 1000000000000000.0'. –

ответ

0

Это, кажется, близка к тому, что вы просите:

static String format(double n) { 
    if(Double.isInfinite(n) || Double.isNaN(n)) 
     return Double.toString(n); 
    String result = BigDecimal.valueOf(n).toPlainString(); 
    if(result.length() > 15) 
     result = String.format("%.15e", n); 
    return result; 
} 

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

Если вы хотите указать определенное количество цифр для научной нотации, то вы можете использовать формат "%.15e", где 15 - это количество десятичных цифр, которое вы хотите.

Или, возможно, вы хотите что-то вроде:

if(result.length() > 15) 
    result = new DecimalFormat("0.###############E0").format(n); 

Но если вы пытаетесь «блок» Выровнять к некоторому максимуму, то все становится сложнее, так как число дробных цифр зависит от количества цифр в экспонента.

0

Просто используйте объект NumberFormat. См. the javadoc.

NumberFormat formatter = new DecimalFormat(); 
if (("" + myDouble).length() > 15) { 
    formatter = new DecimalFormat("0.######E0"); 
    screen.setText(formatter.format(myDouble)); 
} else { 
    formatter = new DecimalFormat("#"); 
    screen.setText(formatter.format(myDouble)); 
} 
Смежные вопросы