Reputation: 2228
BigDecimal val = BigDecimal.valueOf(0.20);
System.out.println(a);
I want to store in val a value 0.20
and not 0.2
. What I can do ?
I dont think I can use NumberFormat
in this case, when I use NumberFormat
I must know what the length of my decimal number is! I can have 0.20 or 0.5000, I don't know the exact length of my decimal number, so I cannot use :
DecimalFormat df = new DecimalFormat("#0.00");
or
DecimalFormat df = new DecimalFormat("#0.00000");
maybe I have just 2 numbers after point or 5 numbers or more, and this program doesn't work:
BigDecimal a = BigDecimal.valueOf(0.20);//i give an example of 0.2 i can have 0.98...0
System.out.println(a);
NumberFormat nf1 = NumberFormat.getInstance();
System.out.println(nf1.format(0.5000));
Upvotes: 3
Views: 35103
Reputation: 114817
BigDecimal remembers the trailing zeros - with some significant side-effect:
BigDecimal bd1 = new BigDecimal("0.20");
BigDecimal bd2 = new BigDecimal("0.2");
System.out.println(bd1);
System.out.println(bd2);
System.out.println(bd1.equals(bd2));
will print
0.20
0.2
false
And we need to remember, that we can't use BiGDecimal for numbers, where the decimal expansion has a period:
BigDecimal.ONE.divide(new BigDecimal(3));
will throw an exception (what partially answers your concerns in your comments)
Upvotes: 7
Reputation: 913
EDIT: this answer is wrong as pointed out in the comments :| thx Andreas_D
The problem is that there is no mathematical difference between 0.2 and 0.20 so your only chance is to display a certain number of digits after the decimal point. Once you store 0.2 or 0.20 in a BigDecimal
they are indistinguishable from each other
Upvotes: 0
Reputation: 692191
You're passing a double to BigDecimal.valueOf()
. And 0.20
is exactly the same double as 0.2
. Pass it a String, and the result will be different, because the scale of the BigDecimal will be deduced from the number of decimals in the String:
BigDecimal bd1 = new BigDecimal("0.20");
BigDecimal bd2 = new BigDecimal("0.2");
System.out.println(bd1.toPlainString() + ", scale = " + bd1.scale()); // 0.20, scale = 2
System.out.println(bd2.toPlainString() + ", scale = " + bd2.scale()); // 0.2, scale = 1
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(bd1.scale());
System.out.println(nf.format(bd1)); // 0,20 (in French locale)
nf.setMinimumFractionDigits(bd2.scale());
System.out.println(nf.format(bd2)); // 0,2 (in French locale)
Upvotes: 3
Reputation: 3260
You could use the String constructor of BigDecimal. It preserves the scale (which is what you want).
BigDecimal val = new BigDecimal("0.20");
See http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(java.lang.String)
Upvotes: 3