2013-09-22 7 views
8

Я программирую простую java-программу. Мне нужно получить строку из ввода и разделить ее на две части: 1-двойную 2-строку. Затем мне нужно сделать простой расчет по двойнику и отправить результат на выход с определенной точностью (4). Он работает нормально, но есть проблема, когда ввод равен 0, тогда он работает неправильно.Двойное значение с определенной точностью в java

Например, для этих входных данных, выход будет:

1 кг
выход: 2,2046

3,1 кг
выход: 6,8343

Но когда вход 0, то выход должен 0,0000, но он показывает 0.0. Что делать, чтобы заставить его показывать 0,0000?

Я прочитал подобный пост о двойной точности, они предлагают что-то вроде BigDecimal класса, но я не могу их использовать в этом случае, мой код делает это:

line=input.nextLine(); 
array=line.split(" "); 
value=Double.parseDouble(array[0]); 
type=array[1]; 
value =value*2.2046; 
String s = String.format("%.4f", value); 
value = Double.parseDouble(s); 
System.out.print(value+" kg\n"); 
+0

Try "% 0.4f". Это означает, что «отформатируйте значение с плавающей запятой, поместите его нулями до тех пор, пока у вас не будет 4 цифры». – user268396

+0

Я использовал «% .4f», но он показывает эту ошибку: Исключение в потоке «main» java.util.MissingFormatWidthException: 0.4f – MehrdadSComputer

+1

См. Также http://stackoverflow.com/questions/10959424/show-only-two- digit-after-decimal, но это не дубликат этого из-за форматирования, необходимого для 0. – Raedwald

ответ

18

DecimalFormat позволит вам определить, сколько цифр вы хотите отобразить. A '0' заставит вывод цифр, даже если значение равно нулю, тогда как '#' опустит нули.

System.out.print(new DecimalFormat("#0.0000").format(value)+" kg\n"); должно быть уловкой.

См documentation

Примечание: если часто используется для повышения производительности вы должны создать экземпляр форматировщик только один раз и хранить ссылки: final DecimalFormat df = new DecimalFormat("#0.0000");. Затем используйте df.format(value).

+0

можете ли вы использовать его в коде, я не знаю, как его использовать! – MehrdadSComputer

+0

Я уже сделал, заменил вашу последнюю строку, которая выводит ваше значение. – Blacklight

+0

это сработало для меня, но, пожалуйста, измените его на («# 0.0000»), ваш ответ на выход равен .0000, но если мы будем использовать («# 0.0000»), он покажет 0.0000, спасибо за вашу помощь. – MehrdadSComputer

0

Использование DecimalFormat для форматирования двойное значение для вывода строковой точности.

DecimalFormat is a concrete subclass of NumberFormat that formats decimal numbers. It has a variety of features designed to make it possible to parse and format numbers in any locale, including support for Western, Arabic, and Indic digits. It also supports different kinds of numbers, including integers (123), fixed-point numbers (123.4), scientific notation (1.23E4), percentages (12%), and currency amounts ($123). All of these can be localized.

Пример -

System.out.print(new DecimalFormat("##.##").format(value)+" kg\n"); 
+0

ответ и ответ черного света - вот что я хочу, спасибо за вашу помощь. – MehrdadSComputer

+0

@downvoter любезно комментарий для negetive? –

0

String.format - просто makign Строковое представление значения с плавающей запятой. Если он не дает флага для минимальной точности, то просто наденьте конец строки нулями.

+0

Ответ BlackLight выглядит лучше. – Aaron

+0

Я использовал ваше предложение, но оно не работает, как вы сказали, ответ BlackLight - это то, что я хочу, спасибо, – MehrdadSComputer

+0

Невозможно, чтобы мой ответ «не работал»: D Это просто добавление «0» к строке. Однако это неоптимальное решение. Нет смысла повторно изобретать колеса! – Aaron

4

добавить этот экземпляр DecimalFormat в верхней части метода:

DecimalFormat four = new DecimalFormat("#0.0000"); // will round and display the number to four decimal places. No more, no less. 

// the four zeros after the decimal point above specify how many decimal places to be accurate to. 
// the zero to the left of the decimal place above makes it so that numbers that start with "0." will display "0.____" vs just ".____" If you don't want the "0.", replace that 0 to the left of the decimal point with "#" 

затем вызвать экземпляр «четыре» и передать ваши двойное значение при отображении:

double value = 0; 
System.out.print(four.format(value) + " kg/n"); // displays 0.0000 
1

Я предлагаю вам используйте класс BigDecimal для вычисления значений с плавающей запятой. Вы сможете контролировать точность арифметики с плавающей запятой.Но вернемся к теме :)

Вы можете использовать следующее:

static void test(String stringVal) { 
    final BigDecimal value = new BigDecimal(stringVal).multiply(new BigDecimal(2.2046)); 
    DecimalFormat df = new DecimalFormat(); 
    df.setMaximumFractionDigits(4); 
    df.setMinimumFractionDigits(4); 
    System.out.println(df.format(value) + " kg\n"); 
} 

public static void main(String[] args) { 
    test("0"); 
    test("1"); 
    test("3.1"); 
} 

даст вам следующий вывод:

0,0000 kg 

2,2046 kg 

6,8343 kg 
+0

Спасибо за вашу информацию, я не знал, как использовать bigDecimal для установки точности. – MehrdadSComputer

Смежные вопросы