(Ответ ниже с использованием Java 8.)
Проблема вы видите происходит от определения «0,15» или «0,05» в коде , который, будучи представленным как двойной, немного меньше 0,15. Проверьте это
DecimalFormat df = new DecimalFormat("#.#");
df.setRoundingMode(RoundingMode.HALF_UP);
BigDecimal bd = new BigDecimal(0.15);
System.out.println("bd=" + bd);
System.out.println(df.format(0.15)); // expecting 0.1, getting 0.1
bd = new BigDecimal(0.05);
System.out.println("bd=" + bd);
System.out.println(df.format(0.05));
bd = new BigDecimal(0.06);
System.out.println("bd=" + bd);
System.out.println(df.format(0.06));
Вывод этого кода
bd=0.1499999999999999944488848768742172978818416595458984375
0.1
bd=0.05000000000000000277555756156289135105907917022705078125
0.1
bd=0.059999999999999997779553950749686919152736663818359375
0.1
Возможное решение (если это абсолютно необходимо, чтобы закруглить правильный путь), чтобы использовать BigDecimal.valueOf для создания ценности. Например
BigDecimal bd = BigDecimal.valueOf(0.15);
System.out.println("bd=" + bd);
System.out.println(df.format(bd)); // expecting 0.1, getting 0.1
bd = BigDecimal.valueOf(0.05);
System.out.println("bd=" + bd);
System.out.println(df.format(bd));
bd = BigDecimal.valueOf(0.06);
System.out.println("bd=" + bd);
System.out.println(df.format(bd));
Будет теперь уступают
bd=0.15
0.2
bd=0.05
0.1
bd=0.06
0.1
BTW, так как Scary Вомбат указал, маска устанавливается как 0.0 вместо #. # Составит 0,6 0. Но я думаю, что было позже редактировать затем, когда я начал смотреть на него. Используйте #. #.
это _is_ таинственный! – tofutim
возможно, вам придется умножить на 10 и снова разделить на обход – tofutim
Работы отлично в 1.7 возможно см. Http://stackoverflow.com/questions/22797964/is-inconsistency-in-rounding-between-java-7 -and-java-8-a-bug –