﻿ java – “new BigDecimal(13.3D)”导致不精确的“13.3000000000000007105 ..”？ - 代码日志

#### java – “new BigDecimal(13.3D)”导致不精确的“13.3000000000000007105 ..”？

Java的BigDecimal怎么可能是痛苦的？

``````Double d = 13.3D;

BigDecimal bd1 = new BigDecimal(d);
BigDecimal bd2 = new BigDecimal(String.valueOf(d));

System.out.println("RESULT 1: "+bd1.toString());
System.out.println("RESULT 2: "+bd2.toString());

RESULT 1: 13.300000000000000710542735760100185871124267578125
RESULT 2: 13.3
``````

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
.

http://stackoverflow.com/questions/460755/new-bigdecimal13-3d-results-in-imprecise-13-3000000000000007105