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