Проблема, с которой вы столкнулись, состоит в том, что 0,1 представляется с немного большим числом, например,
System.out.println(new BigDecimal(0.1));
печать
0.1000000000000000055511151231257827021181583404541015625
Double.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