Вот

я двойное значение =1.068879335 я хочу округлить его только с двумя десятичными значениями, как 1,07.

Я пытался так

DecimalFormat df=new DecimalFormat("0.00");
String formate = df.format(value);
double finalValue = Double.parseDouble(formate) ;

это дает мне следующее исключение

java.lang.NumberFormatException: For input string: "1,07"
     at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
     at java.lang.Double.parseDouble(Double.java:510)

может кто-нибудь сказать мне, что не так с моим кодом.

наконец, мне нужно finalValue =1.07;

 fmucar25 янв. 2011 г., 18:38
если вы округлите это значение до 1,085879335 с точностью до двух цифр, то будет 1,09 и 1,08 при округлении вниз. почему вы хотите получить 1,07 из 1,085879335?

Ответы на вопрос(1)

Решение Вопроса

DecimalFormat использует специфическую для локали строку-разделитель, в то время какDouble.parseDouble() не. Так как вы живете в стране, где десятичный разделитель равен «,», вы не можете разобрать свой номер обратно.

Тем не менее, вы можете использовать тот жеDecimalFormat разобрать его обратно:

DecimalFormat df=new DecimalFormat("0.00");
String formate = df.format(value); 
double finalValue = (Double)df.parse(formate) ;

Но вы действительно должны сделать это вместо этого:

double finalValue = Math.round( value * 100.0 ) / 100.0;

Примечание: Как было указано, вы должны использовать плавающую точку, только если вам не нужен точный контроль над точностью. (Финансовые расчеты являются основным примером того, когдане использовать их.)

 Waldheinz25 янв. 2011 г., 22:26
Как я указал в своем ответе, этот алгоритм обычно не работает. И до тех пор, пока Java придерживается IEEE с плавающей запятой, такого алгоритма не существует.
 DJClayworth25 янв. 2011 г., 19:00
+1 за фактическое выявление проблемы. Вы также можете явно указать DecimalFormat использовать локаль C.
 biziclop25 янв. 2011 г., 23:10
@ Waldheinz Это хорошо, я просто подумал, что нет необходимости редактировать мой ответ с этим важным вопросом, потому что вы объяснили это очень хорошо. В следующий раз я не буду таким ленивым. :)
 biziclop25 янв. 2011 г., 22:36
@Waldheinz Учитывая контекст вопроса, мой ответ правильный. Честная игра, если ты думаешь на шаг впереди, но должен ли я знать, как занижать твой ответ, потому что ты совершенно не смог определить, почему код вообще не удался? Конечно, я не должен.
 Waldheinz25 янв. 2011 г., 22:59
Извините, я не хотел обидеть. Просто хотел отметить, что даже исправленный код не работает для каждого ввода. Но тогда вы ответили на оригинальный вопрос.

Ваш ответ на вопрос