The problem you have is that 0.1 is represented with a slightly higher number e.g.
System.out.println(new BigDecimal(0.1));
prints
0.1000000000000000055511151231257827021181583404541015625
The Double.toString() takes into account this representation error so you don't see it.
Similarly 0.3 is represented by a value slightly lower than it really is.
0.299999999999999988897769753748434595763683319091796875
If you multiply the represented value of 0.1 by 3 you don't get the represented value for 0.3, you instead get something a little higher
0.3000000000000000166533453693773481063544750213623046875
This is not just a representation error but also a rounding error caused by the operations. This is more than the Double.toString() will correct and so you see the rounding error.
The moral of the story, if you use float
or double
also round the solution appropriately.
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);
prints
0.30000000000000004
0.3
BigDecimal
. You're doing exactly the same thing as adding the doubles.doubleValue()
returns ... a double. See the Javadoc forBigDecimal
on how to add/subtract/etc – Mozellemozesdouble
calculations, see What Every Computer Scientist Should Know About Floating-Point Arithmetic. Java solves this by providing format options for output. – SurvivordoubleValue()
??? I thought you wanted a decimal type. – Pedicle