Используйте точный тип, если вам нужен точный результат:
double val = 3.9 - (3.9 % 0.1);
System.out.println(val); // 3.8000000000000003
BigDecimal x = new BigDecimal( "3.9" );
BigDecimal bdVal = x.subtract( x.remainder( new BigDecimal( "0.1" ) ) );
System.out.println(bdVal); // 3.9
Почему 3.8000 ... 003? Потому что Java использует FPU для вычисления результата. 3.9 невозможно хранить точно в нотации двойной точности IEEE, поэтому он хранит 3.89999 ... И 3,8999% 0,01 дает 0,09999 ... следовательно, результат немного больше, чем 3,8.