Java - неожиданный результат при округлении double/float до 2 десятичных знаков

Я сталкиваюсь с проблемой при округлении от двух до двух знаков после запятой. Я знаю, что эти вопросы задавались во многих местах. Но мой вопрос немного другой, и я не могу найти его в других местах.

Насколько я знаю, есть 2 способа сделать это.

  1. Math.round(double*100.0)/100.0
  2. DecimalFormat(“###.##”)

Я пытаюсь использовать первый способ: пользовательский способ округлить вдвое. Когда второе десятичное число равно 0, результат будет печатать только первое десятичное число и игнорировать второе.

Например,

  1. Math.round(1.23333*100.0)/100.0 Результат 1,23. Это хорошо работает.
  2. Math.round(3.90*100.0)/100.0. Результат 3,9. Проблема возникает. Я хочу показать 3,90 вместо 3,9
  3. Math.round(3*100.0)/100.0, Результат 4.0. Я хочу 4,00 вместо 4,0

Итак, мой вопрос заключается в том, как я могу иметь двойное значение с 2 десятичными знаками, независимо от того, является ли последнее десятичное число 0 или нет. Я знаю, что могу использовать второй способ DecimalFormat(“###.##”)добиться того, чего я хочу! Но возможно ли это сделать первым способом?

Изменить: Спасибо за ответы. Похоже, что невозможно использовать метод round() для его достижения. Тем не менее, некоторые люди предлагают использовать комбинацию из 2 способов для достижения этой цели. Но я думаю, используя только DecimalFormat(“###.##”) могу получить то, что я хочу. Кто-нибудь может это подтвердить?

4 ответа

Решение

Вы пробовали следующее?

DecimalFormat(“###.00”)

Если не ошибаюсь, конечные нули оставляются пустыми при использовании знака #.

Я бы предложил использовать String.format("%1$.2f",x). Он округляет значение до указанной точности (2 цифры в нашем примере) и оставляет завершающие нули справа.

System.out.println(String.format("%1$.2f",3.121)) gives 3.12
System.out.println(String.format("%1$.2f",3.129)) gives 3.13
System.out.println(String.format("%1$.2f",3.12))  gives 3.12
System.out.println(String.format("%1$.2f",3.10))  gives 3.10

Вы должны форматировать свой результат с DecimalFormat

DecimalFormat format = new DecimalFormat("0.00");
System.out.println(Math.round(3.90*100.0)/100.0); // 3.9
System.out.println(format.format(Math.round(3.90*100.0)/100.0)); // after using format 3.90
System.out.println(format.format(Math.round(3*100.0)/100.0));

И вывод

3.9
3.90
3.00

Я считаю, что вам нужно использовать комбинацию обоих для достижения ваших потребностей. Округление, чтобы получить число с двумя десятичными знаками, и DecimalFormat чтобы отобразить его с двумя десятичными знаками.

Другие вопросы по тегам