Convert string to BigDecimal in java

JavaBigdecimal

Java Problem Overview


I am reading a currency from XML into Java.

String currency = "135.69";

When I convert this to BigDecimal I get:

 System.out.println(new BigDecimal(135.69));

Output:

135.68999999999999772626324556767940521240234375.

Why is it that it outputs this many numbers? How can I avoid this? All I want is for it to output 135.69.

Java Solutions


Solution 1 - Java

The BigDecimal(double) constructor can have unpredictable behaviors. It is preferable to use BigDecimal(String) or BigDecimal.valueOf(double).

System.out.println(new BigDecimal(135.69)); //135.68999999999999772626324556767940521240234375
System.out.println(new BigDecimal("135.69")); // 135.69
System.out.println(BigDecimal.valueOf(135.69)); // 135.69

The documentation for BigDecimal(double) explains in detail:

> 1. The results of this constructor can be somewhat unpredictable. One might assume that writing new BigDecimal(0.1) in Java creates a > BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with > a scale of 1), but it is actually equal to > 0.1000000000000000055511151231257827021181583404541015625. This is because 0.1 cannot be represented exactly as a double (or, for that > matter, as a binary fraction of any finite length). Thus, the value > that is being passed in to the constructor is not exactly equal to > 0.1, appearances notwithstanding. > 2. The String constructor, on the other hand, is perfectly predictable: writing new BigDecimal("0.1") creates a BigDecimal which > is exactly equal to 0.1, as one would expect. Therefore, it is > generally recommended that the String constructor be used in > preference to this one. > 3. When a double must be used as a source for a BigDecimal, note that this constructor provides an exact conversion; it does not give > the same result as converting the double to a String using the > Double.toString(double) method and then using the BigDecimal(String) > constructor. To get that result, use the static valueOf(double) > method.

Solution 2 - Java

String currency = "135.69";
System.out.println(new BigDecimal(currency));

//will print 135.69

Solution 3 - Java

You are storing 135.69 as String in currency. But instead of passing variable currency, you are again passing 135.69(double value) into new BigDecimal(). So you are seeing a lot of numbers in the output. If you pass the currency variable, your output will be 135.69

Solution 4 - Java

May I add something. If you are using currency you should use Scale(2), and you should probably figure out a round method.

Solution 5 - Java

BigDecimal b = BigDecimal.valueOf(d);

import java.math.*; 
  
public class Test { 
  
    public static void main(String[] args) 
    { 
  
        // Creating a Double Object 
        Double d = new Double("785.254"); 
  
        /// Assigning the bigdecimal value of ln to b 
        BigDecimal b = BigDecimal.valueOf(d); 
  
        // Displaying BigDecimal value 
        System.out.println("The Converted BigDecimal value is: " + b); 
    } 
}

Solution 6 - Java

Spring Framework provides an excellent utils class for achieving this.

Util class : NumberUtils

String to BigDecimal conversion -

NumberUtils.parseNumber("135.00", BigDecimal.class);

Solution 7 - Java

Hi Guys you cant convert directly string to bigdecimal

you need to first convert it into long after that u will convert big decimal

String currency = "135.69"; 
Long rate1=Long.valueOf((currency ));    		 
System.out.println(BigDecimal.valueOf(rate1));

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHari RaoView Question on Stackoverflow
Solution 1 - JavaMarlon PatrickView Answer on Stackoverflow
Solution 2 - JavaSireesh VattikutiView Answer on Stackoverflow
Solution 3 - JavasandeepView Answer on Stackoverflow
Solution 4 - JavaJuan DiegoView Answer on Stackoverflow
Solution 5 - JavaNeeraj GahlawatView Answer on Stackoverflow
Solution 6 - Javacold_brewView Answer on Stackoverflow
Solution 7 - Javabaisakhi chauhanView Answer on Stackoverflow