(Ответ ниже с использованием 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
Кстати, как указал Scary Wombat, маска, установленная как 0,0 вместо #.#, сделает 0,6 0. Но я думаю, что это было более позднее редактирование, чем когда я начал смотреть на это. Использовать #.#.
person
tofutim
schedule
13.05.2016
0.0
только тогда, когда у меня включенHALF_UP
. Это очень странно. - person 4castle   schedule 13.05.2016