Проблема заключается в том, что 0,1 представлен немного большим числом, например.
System.out.println(new BigDecimal(0.1));
печатает
0.1000000000000000055511151231257827021181583404541015625
Двойник.toString() учитывает эту ошибку представления, поэтому вы ее не видите.
Аналогично 0,3 представлено немного ниже, чем на самом деле.
0.299999999999999988897769753748434595763683319091796875
Если умножить представляемое значение 0,1 на 3 вы не получите представляемое значение 0,3, то вместо того, чтобы получить что-то немного выше
0.3000000000000000166533453693773481063544750213623046875
Это не просто ошибка, но представления также ошибка округления, вызванная операциями. Это больше, чем Double.toString() будет исправлено, и вы увидите ошибку округления.
Мораль истории, если вы используете float
или double
, также округлите решение соответствующим образом.
double d = 0.1 + 0.1 + 0.1;
System.out.println(d);
double d2 = (long)(d * 1e6 + 0.5)/1e6; // round to 6 decimal places.
System.out.println(d2);
печатает
0.30000000000000004
0.3
Вы ... не используете 'BigDecimal'. Вы делаете * точно такую же вещь *, как добавление двойников. 'doubleValue()' возвращает ... double. См. Javadoc для 'BigDecimal' о том, как добавить/вычесть/etc –
Повторите вычисления' double', см. [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle.com/cd/ E19957-01/806-3568/ncg_goldberg.html). Java решает это, предоставляя параметры формата для вывода. –
Почему вы используете 'doubleValue()' ??? Я думал, вы хотите десятичный тип. –