Как сохранить конечные 0 при преобразовании строки в BigDecimal без экспоненты - PullRequest
1 голос
/ 19 сентября 2019

Мне нужно преобразовать эти две строки "0.0000000" и "0.0000008" в BigDecimal без потери конечных 0 с.

Я пробовал String.format

String format = "%." + precision + "f";
BigDecimal divisor = new BigDecimal(Math.pow(10, precision));
formattedAmount = amountValue.divide(divisor).setScale(precision, BigDecimal.ROUND_DOWN);
String str= String.format(format, formattedAmount);
System.out.println(str);
BigDecimal strb = new BigDecimal(str);
System.out.println(strb);

Я ожидаю, что эти две строки "0.0000000" и "0.0000008" будут возвращены как BigDecimal без показателя степени, как 0.0000000 и 0.0000008 .Но я получаю 0E-7 и 8E-7 . Мне нужно 0.0000000 и 0.0000008 как BigDecimal, а не как String.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Когда вы пытаетесь напечатать BigDecimal в System.out.println(strb), будет вызван метод toString() для объекта strb.Таким образом, вывод в консоли также string .

Подробнее Связь между 'System.out.println ()' и 'toString ()' в Java

Так что единственный способ сказать Java неиспользуйте здесь показатель System.out.println(strb), чтобы изменить toString() метод.Вы не можете изменить его напрямую, но вы можете создать свой собственный класс, который расширяет BigDecimal и переопределяет toString() метод, который вам нужен.Очевидно, это не имеет смысла ... просто используйте метод toPlainString().Из документа Java:

возвращает строковое представление этого {@code BigDecimal} без поля экспоненты.

0 голосов
/ 19 сентября 2019

Прежде всего, независимо от того, как вы выводите значение BigDecimal, оно остается неизменным в его экземпляре (до тех пор, пока вы не выполняете вычисления).

Однако, выход может сильно отличаться.Вот методы, которые BigDecimal предлагает

public static void main(String[] args) {
    String zero = "0.0000000";
    String zeroDotsEight = "0.0000008";

    BigDecimal z = new BigDecimal(zero);
    BigDecimal zE = new BigDecimal(zeroDotsEight);

    // play around with the precision and have a look at the output
    int precision = 7;

    System.out.println("String:\t\t\t\t\t" + zero);
    System.out.println("BigDecimal:\t\t\t\t" + z.setScale(precision, BigDecimal.ROUND_DOWN));
    System.out.println("BigDecimal.toString():\t\t\t"
            + z.setScale(precision, BigDecimal.ROUND_DOWN).toString());
    System.out.println("BigDecimal.toPlainString():\t\t"
            + z.setScale(precision, BigDecimal.ROUND_DOWN).toPlainString());
    System.out.println("BigDecimal.toEngineeringString():\t"
            + z.setScale(precision, BigDecimal.ROUND_DOWN).toEngineeringString());
    System.out.println("BigDecimal.doubleValue():\t\t"
            + z.setScale(precision, BigDecimal.ROUND_DOWN).doubleValue());

    System.out.println("————————————————————————————————————————————————————————————————");

    System.out.println("String:\t\t\t\t\t" + zeroDotsEight);
    System.out.println("BigDecimal:\t\t\t\t" + zE.setScale(precision, BigDecimal.ROUND_DOWN));
    System.out.println("BigDecimal.toString():\t\t\t"
            + zE.setScale(precision, BigDecimal.ROUND_DOWN).toString());
    System.out.println("BigDecimal.toPlainString():\t\t"
            + zE.setScale(precision, BigDecimal.ROUND_DOWN).toPlainString());
    System.out.println("BigDecimal.toEngineeringString():\t"
            + zE.setScale(precision, BigDecimal.ROUND_DOWN).toEngineeringString());
    System.out.println("BigDecimal.doubleValue():\t\t"
            + zE.setScale(precision, BigDecimal.ROUND_DOWN).doubleValue());
}

, и это вывод моей системы

String:                             0.0000000
BigDecimal:                         0E-7
BigDecimal.toString():              0E-7
BigDecimal.toPlainString():         0.0000000
BigDecimal.toEngineeringString():   0.0E-6
BigDecimal.doubleValue():           0.0
————————————————————————————————————————————————————————————————
String:                             0.0000008
BigDecimal:                         8E-7
BigDecimal.toString():              8E-7
BigDecimal.toPlainString():         0.0000008
BigDecimal.toEngineeringString():   800E-9
BigDecimal.doubleValue():           8.0E-7

Как видите, @Ruslan прав.Вы должны создать свой собственный класс или использовать toPlainString(), чтобы сохранить формат и не потерять конечные нули (что должно иметь значение только для человеческого глаза, но я даже сомневаюсь, что это действительно так).Кроме того, вы также были правы, когда отметили, что doubleValue() - это не то, что нужно.

Как указано в единственном комментарии к коду, поиграйтесь с точностью, возможно, вычислите некоторые значения перед печатью и /или сохраняя результаты в переменных.

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