Проблема в том, что 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
person
Peter Lawrey
schedule
21.03.2012
BigDecimal
. Вы делаете в точности то же самое, как добавляете двойники.doubleValue()
возвращает ... дубль. См. Javadoc дляBigDecimal
о том, как складывать / вычитать / и т. Д. - person Brian Roach   schedule 21.03.2012double
расчетов см. Что должен знать каждый компьютерный ученый о плавающих -Точечная арифметика. Java решает эту проблему, предоставляя параметры формата для вывода. - person Andrew Thompson   schedule 21.03.2012