#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 Вы совершенно правы, я неправильно прочитал ваш код при его просмотре