Convert string to BigDecimal in java
JavaBigdecimalJava 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));