BigDecimal来自Double不正确的值?

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

有任何想法吗?

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

 new BigDecimal("0.3") 

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

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

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

这将打印出“0.30”

另一种方法是使用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()); 

OUTPUT

 The Double: 0.3 The Big: 0.3000000