2012-04-13 2 views
0
float a= (float) 1846.4; 

NumberFormat df = DecimalFormat.getInstance(); 
df.setMinimumFractionDigits(2); 
df.setMaximumFractionDigits(2); 

float b = Float.parseFloat(df.format(a)); 

Что бы быть лучшим способом установить десятичные места для поплавка (я просто хочу, чтобы установить 2 дробную часть значения с плавающей точкой, которая может быть 2013.43452 или 2392.2)? Теперь я получаю исключение, например E xception in thread "main" java.lang.NumberFormatException: For input string: "1,846.40".установка знаков после запятой в значение флоат

+0

Зачем вам эти десятичные знаки? 'b' также будет просто' 1846.4' и что форматирование + синтаксический анализ является просто странным и совершенно ненужным. – Thomas

ответ

3

Я думаю, что прямая проблема, вызывающая NFE, - это тысячи разделителей в строке, а не число десятичных знаков. У вас есть как ',', так и '.' в строке, а parseFloat не нравится.

Обратите внимание, что вы не можете исправить количество знаков после запятой в значении float - это полностью проблема форматирования. В частности, конечные 0 не имеют значения в значениях с плавающей запятой, поэтому по умолчанию они не будут отображаться. Вам нужно отформатировать значение в соответствии с вашими пожеланиями в точке вывода (при преобразовании его в отображаемый String, например, используя DecimalFormat, как вы это делали выше).

+0

Я хочу установить 2 десятичное место поплавка. любой способ установить входящее значение? – kitokid

+0

@PTY, вы не можете сделать это так, как вы пытаетесь - см. Мое обновление. –

+0

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

0

Похоже, вы просто хотите округлить до двух знаков после запятой.

Формат номера и обводка со строками - это не то место, куда вы хотите отправиться.

Попробуйте это:

float b = Math.round(a * 100)/100.0f; 
+2

Получил свободу менять делитель, поэтому вы получаете 'float' с делением с плавающей запятой вместо' long' с целым делением. –

+0

plus один. Я буду использовать его в следующий раз.но теперь я просто планирую играть со значением, когда ему нужно отображать. – kitokid

+0

Этот метод не работает, более 90% ненадежности. И «формат номера и смещение со строками» - это точно, где он хочет пойти, или использовать «BigDecimal». – EJP

1

Чтобы получить ваше форматирование + разбор на работу, просто использовать df снова:

float b = df.parse(df.format(a)); 

Однако я до сих пор не вижу никакого смысла в этом. Вы не можете определить количество знаков после запятой в номере с плавающей запятой. 1846.40 совпадает с 1846.4 или 1846.400, конечные нули совершенно не имеют значения.

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

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

0

Что бы лучший способ установки знаков после запятой для поплавка

Существует не один. Поплавки не есть десятичные знаки. У них есть бинарные места.

Если вы хотите использовать десятичные знаки, вам необходимо использовать десятичный радиус, либо BigDecimal, либо результат DecimalFormat.format().

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