Bigdecimal Not giving exact output in Java

Im adding three big decimals here, but it should give me accurate answer. I'm having two strings here and then converting to big decimal. Please dont ask why Im using strings. There is some business where I will get these values as string then I need to convert. Please find the code

BigDecimal a= new BigDecimal(100.05); --> This value I receive from web service. Its a decimal value from the service. 
    String b= "100.05";
    String c= "200.03";
    System.out.println(a.add(new BigDecimal(b).add(new BigDecimal(c))));

Output it gives

400.1299999999999971578290569595992565155029296875

Where as it should be 400.13

Jon Skeet
people
quotationmark

The problem is your use of new BigDecimal(100.05). The value of a is then 100.0499999999999971578290569595992565155029296875.

If you had specified that value as a string instead, all would be well:

BigDecimal a = new BigDecimal("100.05");
String b = "100.05";
String c = "200.03";
System.out.println(a.add(new BigDecimal(b).add(new BigDecimal(c))));
// Output: 400.13

If you only have the input as a double, you can use BigDecimal.valueOf(double) instead of calling the constructor:

BigDecimal a = BigDecimal.valueOf(100.05); // a is now exactly 100.05

Compare the BigDecimal(double) documentation:

Translates a double into a BigDecimal which is the exact decimal representation of the double's binary floating-point value. (...)

With that of BigDecimal.valueOf(Double):

Translates a double into a BigDecimal, using the double's canonical string representation provided by the Double.toString(double) method.

Note: This is generally the preferred way to convert a double (or float) into a BigDecimal, as the value returned is equal to that resulting from constructing a BigDecimal from the result of using Double.toString(double).

people

See more on this question at Stackoverflow