BigDecimal来自Double不正确的值?

时间:2010-09-11 23:00:45

标签: java double bigdecimal

我正在尝试从字符串中创建一个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

有什么想法吗?

3 个答案:

答案 0 :(得分:12)

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

new BigDecimal("0.3")

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

答案 1 :(得分:0)

您可以给指定精度的大小数。例如附加到你的例子:

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

这将打印出“0.30”

答案 2 :(得分:0)

另一种方法是使用MathContext.DECIMAL32来保证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