5

我正在尝试从字符串中生成 BigDecimal。不要问我为什么,我就是需要!这是我的代码:

Double theDouble = new Double(".3");
System.out.println("The Double: " + theDouble.toString());
BigDecimal theBigDecimal = new BigDecimal(theDouble);
System.out.println("The Big: " + theBigDecimal.toString());

这是我得到的输出?

The Double: 0.3
The Big: 0.299999999999999988897769753748434595763683319091796875

有任何想法吗?

4

3 回答 3

12

创建双精度时,值 0.3 无法准确表示。您可以从没有中间双精度的字符串创建 BigDecimal,如

new BigDecimal("0.3")

浮点数表示为二进制分数和指数。因此,有些数字无法准确表示。以 10 为底的数字有一个类似的问题,例如 1/3,即 0.333333333 ...... 1/3 的任何十进制表示都是不精确的。这发生在二进制分数的不同集合中,而 0.3 是二进制不精确的集合之一。

于 2010-09-11T23:04:10.690 回答
0

您可以为大小数指定指定的精度。例如附加到您的示例:

Double theDouble = new Double(".3");
theBigDecimal = new BigDecimal(theDouble, new MathContext(2));
System.out.println("The Big: " + theBigDecimal.toString());

这将打印出“0.30”

于 2010-09-11T23:09:53.937 回答
0

另一种方法是使用MathContext.DECIMAL32which 保证 7 位精度(这在我们的例子中已经足够好了):

Double theDouble = new Double(".3");
System.out.println("The Double: " + theDouble.toString());
BigDecimal theBigDecimal = new BigDecimal(theDouble, MathContext.DECIMAL32);  // <-- here
System.out.println("The Big: " + theBigDecimal.toString());

输出

The Double: 0.3
The Big: 0.3000000
于 2017-08-13T18:11:17.873 回答