BigDecimal от Double неверное значение? - PullRequest
4 голосов
/ 12 сентября 2010

Я пытаюсь сделать 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 ]

12 голосов
/ 12 сентября 2010

Когда вы создаете double, значение 0.3 не может быть представлено точно.Вы можете создать BigDecimal из строки без промежуточного двойного числа, как в

new BigDecimal("0.3")

Число с плавающей запятой представляется как двоичная дробь и показатель степени.Поэтому есть некоторые числа, которые не могут быть представлены точно.Существует аналогичная проблема в базе 10 с числами, такими как 1/3, что составляет 0,333333333 ..... Любое десятичное представление 1/3 является неточным.Это происходит с РАЗЛИЧНЫМ набором дробей в двоичном коде, и 0,3 является одним из наборов, который неточен в двоичном.

0 голосов
/ 13 августа 2017

Другой способ - использовать 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
0 голосов
/ 12 сентября 2010

Вы можете задать большую десятичную с заданной точностью.например, добавьте к вашему примеру:

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

Это выведет "0.30"

...