BigDecimal в строку

У меня есть объект BigDecimal, и я хочу преобразовать его в строку. Проблема в том, что мое значение получило дробь, и я получаю огромное число (по длине), и мне нужно только исходное число в строке, например: для

BigDecimal bd = new BigDecimal(10.0001)
System.out.println(bd.toString());
System.out.println(bd.toPlainString());

вывод:

10.000099999999999766941982670687139034271240234375
10.000099999999999766941982670687139034271240234375

и мне нужно, чтобы вывод был точно номером 10.0001 в строке


person Yo Al    schedule 16.12.2012    source источник


Ответы (7)


Чтобы получить именно 10.0001, вам нужно использовать конструктор String или valueOf (который создает BigDecimal на основе канонического представления двойного числа):

BigDecimal bd = new BigDecimal("10.0001");
System.out.println(bd.toString()); // prints 10.0001
//or alternatively
BigDecimal bd = BigDecimal.valueOf(10.0001);
System.out.println(bd.toString()); // prints 10.0001

Проблема с new BigDecimal(10.0001) заключается в том, что аргументом является double, и бывает так, что удвоения не могут точно представлять 10.0001. Таким образом, 10.0001 "трансформируется" в ближайший возможный двойник, то есть 10.000099999999999766941982670687139034271240234375, и это то, что показывает ваш BigDecimal.

По этой причине редко имеет смысл использовать двойной конструктор.

Вы можете узнать больше об этом здесь, Перемещение десятичных знаков в двойном

person assylias    schedule 16.12.2012
comment
Более эффективным способом преобразования double является использование BigDecimal.valueOf(double); - person Peter Lawrey; 16.12.2012
comment
@PeterLawrey Не уверен, что понимаю. BigDecimal.valueOf(double) округляет двойное число таким же образом, как двойное число округляется при печати, что использует несколько сложные правила, поэтому я не уверен, как вы можете на это полагаться. - person assylias; 16.12.2012
comment
@PeterLawrey Да, я знаю это. Я просто не знаю, насколько предсказуемо, что Double.toString(double) вернет ожидаемый результат. Например, Double.toString(99999999.21110999) возвращает 99999999.21111... - person assylias; 16.12.2012
comment
Это верно, но в этой ситуации использование конструктора также не поможет, вы должны использовать округление. - person Peter Lawrey; 16.12.2012
comment
этот ответ на самом деле не отвечает на вопрос о том, как преобразовать BigDecimal в строку. - person Tim Boland; 14.12.2014

Ваш BigDecimal не содержит числа 10.0001, потому что вы инициализировали его числом double, а число double совсем не содержит того числа, которое, как вы думали, оно содержит. (В этом весь смысл BigDecimal.)

Если вы используете вместо этого конструктор на основе строк:

BigDecimal bd = new BigDecimal("10.0001");

... тогда он действительно будет содержать ожидаемое вами число.

person T.J. Crowder    schedule 16.12.2012

Используя приведенный ниже метод, вы можете преобразовать java.math.BigDecimal в String.

   BigDecimal bigDecimal = new BigDecimal("10.0001");
   String bigDecimalString = String.valueOf(bigDecimal.doubleValue());
   System.out.println("bigDecimal value in String: "+bigDecimalString);

Вывод:
значение bigDecimal в строке: 10,0001

person Saminathan    schedule 13.06.2014

Для лучшей поддержки разных локалей используйте этот способ:

DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
df.setMinimumFractionDigits(0);
df.setGroupingUsed(false);

df.format(bigDecimal);

также вы можете настроить его:

DecimalFormat df = new DecimalFormat("###,###,###");
df.format(bigDecimal);
person Atetc    schedule 12.07.2016

BigDecimal не может быть двойным. вы можете использовать номер Int. если вы хотите отобразить именно свой номер, вы можете использовать конструктор String BigDecimal .

как это:

BigDecimal bd1 = new BigDecimal("10.0001");

теперь вы можете отобразить bd1 как 10.0001

Так просто. УДАЧИ.

person Sajad    schedule 21.12.2012

Чтобы заархивировать необходимый результат с помощью двойного конструктора, вам нужно округлить BigDecimal, прежде чем преобразовывать его в строку, например.

новый java.math.BigDecimal(10.0001).round(новый java.math.MathContext(6, java.math.RoundingMode.HALF_UP)).toString()

напечатает "10.0001"

person foal    schedule 18.04.2016

Если вам просто нужно установить точное количество и округлить значение, правильный способ сделать это - использовать для этого собственный объект.

BigDecimal value = new BigDecimal("10.0001");
value = value.setScale(4, RoundingMode.HALF_UP);
System.out.println(value); //the return should be "10.0001"

Одним из столпов ориентированного объектного программирования (ООП) является «инкапсуляция», этот столп также говорит о том, что объект должен иметь дело со своими собственными операциями, например, таким образом:

person Sham Fiorin    schedule 10.05.2019