See this simple Java source:
import java.math.BigDecimal;
public class TestDouble {
/**
* Translates a
double into a BigDecimal.  The scale* of the BigDecimal is the smallest value such that
* (10scale * val) is an integer.
*
  * Note: the results of this constructor can be somewhat unpredictable.
  * One might assume that new BigDecimal(.1) is exactly equal
  * to .1, but it is actually equal
  * to .1000000000000000055511151231257827021181583404541015625.
  * This is so because .1 cannot be represented exactly as a double
  * (or, for that matter, as a binary fraction of any finite length).
  * Thus, the long value that is being passed in to the constructor
  * is not exactly equal to .1, appearances notwithstanding.
  * 
  * The (String) constructor, on the other hand, is perfectly predictable:
  * new BigDecimal(".1") is exactly equal to .1, as one
  * would expect.  Therefore, it is generally recommended that the (String)
  * constructor be used in preference to this one.
  *
  * @param val double value to be converted to BigDecimal.
  * @throws NumberFormatException val if val is
  *         infinite or NaN.
  */
 public static void main(String[] args) throws Exception {
     double d = 0.1;
     System.out.println(d);
     System.out.println(new BigDecimal(d));
     System.exit(0);
 }
}
And it's output when run:
0.1
0.1000000000000000055511151231257827021181583404541015625
This is far from expected.
See also: http://www.javaranch.com/newsletter/July2003/MoneyInJava.html
Or this Sun form entry: http://forum.java.sun.com/thread.jspa?forumID=256&threadID=252852
 
No comments:
Post a Comment