You can do this in 5 steps:
double d1 = 0.1;
BigDecimal bd1 = new BigDecimal(d1);
BigInteger bi = bd1.unscaledValue();
BigDecimal bd2 = new BigDecimal(bi, bd1.scale());
double d2 = bd2.doubleValue();
The full example applies to the method. sum
Conclusion:
0,1 + 0,1 = 0,2
0,1 + 10,1 = 10,2
0.1245 + 17.0 = 17.1245
:
public static void main(String[] args) {
test(0.1, 0.1);
test(0.1, 10.1);
test(0.1245, 17);
}
private static void test(double d1, double d2) {
System.out.println(d1 + " + " + d2 + " = " + sum(d1, d2));
}
private static double sum(double d1, double d2) {
BigDecimal bd1 = new BigDecimal(d1);
BigDecimal bd2 = new BigDecimal(d2);
int shift = Integer.max(bd1.scale(), bd2.scale());
BigInteger bi1 = bd1.scaleByPowerOfTen(shift).toBigInteger();
BigInteger bi2 = bd2.scaleByPowerOfTen(shift).toBigInteger();
BigInteger sum = sum(bi1, bi2);
return new BigDecimal(sum, shift).doubleValue();
}
private static BigInteger sum(BigInteger i1, BigInteger i2) {
return i1.add(i2);
}