Удаление конечных нулей в десятичной системе счисления

#java #bigdecimal

#java #bigdecimal

Вопрос:

У меня есть значение BigDecimal, и я хочу удалить конечные нули до определенной точки. Вот несколько примеров:

 1.00000 -> 1.0
12.2    -> 12.2
19.9300 -> 19.93
  

Обратите внимание на первый случай, когда мы хотим оставить ровно 1 знак после запятой, когда все десятичные дроби равны нулю. Я хотел бы избежать stripTrailingZeros() , поскольку в некоторых случаях это может быть преобразовано в научную нотацию (например, 1E 1)

РЕДАКТИРОВАТЬ: в этом случае масштаб для BigDecimal уже установлен на значение больше 5.

Комментарии:

1. Вы просто хотите изменить строковое представление BigDecimal или фактически изменить его масштаб и / или точность?

2. Масштаб уже установлен на некоторое высокое значение, скажем, например, 8. Но это должно применяться ТОЛЬКО при наличии ненулевых чисел. Например, 0.1234567890 должно стать 0.12345678

Ответ №1:

Вам нужно использовать stripTrailingZeros() для удаления нулей, но затем вы можете использовать setScale() , чтобы убедиться, что вы получаете хотя бы одну цифру после запятой.

 for (String s : new String[] { "1.00000", "12.2", "19.9300", "1e 10", "1e-10", "0" }) {
    BigDecimal value = new BigDecimal(s);
    
    value = value.stripTrailingZeros();
    if (value.scale() < 1)
        value = value.setScale(1);
    
    System.out.println(value);
}
  

Вывод

 1.0
12.2
19.93
10000000000.0
1E-10
0.0
  

Если вы не хотите 1E-10 , то вам нужно вызвать toPlainString() , потому что именно так обычный toString() выводит такое маленькое значение.

Комментарии:

1. @Spectric Я предоставил ссылки на javadoc. Я призываю людей научиться читать javadoc, а не просто повторять то, что здесь написано. Я знаю, заставляя людей читать документацию, как зло с моей стороны. 😈 😉

2. @Andreas Извините, но я забыл упомянуть, что масштаб уже выше 1 во всех тех случаях, которые я предоставил. Предположим, что это может быть что-то вроде 8

3. @user3696953 Вы сказали: «удалите конечные нули до определенной точки» , затем указали, что определенная точка равна 1 десятичному разряду, и привели примеры, в которых входные данные имели масштабы 5, 1 и 4 соответственно. Этот код делает именно то, что вы просили, и его не волнует, какова исходная шкала. Вы можете установить масштаб на 100, и он все равно удалит все конечные нули, оставив по крайней мере одну цифру после запятой, как показано в дополнительных примерах, которые я добавил.

4. @Andreas Вы совершенно правы, я неправильно прочитал ваш код при его просмотре