2017-02-09 15 views
0

Для получения строки с ровно 2 цифрами после "." Я могу сделать что-то вроде:номер печати с двумя цифрами, но круглый с точностью до 6 цифр

 DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US); 
     df.applyPattern("0.00"); 
     df.setRoundingMode(RoundingMode.HALF_UP); 
     String output = df.format(value); 

Когда у меня есть несколько таких, как 828.054999999702d, он будет отформатировать его в 828.05, что до сих пор правильно, так как следующая цифра говорит «4», и он будет округлять, что до нуля ,

Но что, если мне нужно сохранить точность цифр, просто не хотите его показывать?

То, что я быстро создал этот рабочий код:

 double prettyValue = value; 
     prettyValue = Math.round(prettyValue * 1000000d)/1000000d; 
     prettyValue = Math.round(prettyValue * 100000d)/100000d; 
     prettyValue = Math.round(prettyValue * 10000d)/10000d; 
     prettyValue = Math.round(prettyValue * 1000d)/1000d; 
     prettyValue = Math.round(prettyValue * 100d)/100d; 
     DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US); 
     df.applyPattern("0.00"); 
     df.setRoundingMode(RoundingMode.HALF_UP); 
     String output = df.format(prettyValue); 

Это округлить 6-й, 5-й, 4-й, 3-е, а затем второе место, NumberFormat не придется ничего делать, а просто напечатать 2 оставшихся цифр, после чего будут нули.

Но я думаю, что должно быть уже готовое округление, которое я просто не вижу. Попытка сделать то же самое с BigDecimals приводит к точно такой же проблеме для меня.

В результате я хочу получить 828.054999999702 округленный до 828.06.

+0

Попробуйте округлить при форматировании вывода. – Thomas

+0

Что делает * «что делать, если мне нужно сохранить больше цифр, просто не хочу его показывать?» * Означает? Что означает форматирование дисплея для сохранения точности? Если ваш форматированный текст является вашим сохранением, вы должны показать все цифры, необходимые для сохранения. Если значение сохраняется в противном случае, какая у вас проблема? Я смущен. – Andreas

ответ

2

Я не уверен, я полностью понимаю ваш вопрос, так что давайте мне резюмировать:

  • У вас есть некоторые double значения с потенциально более 6 значимых знаками после запятой.
  • Вы хотите округлить это значение до 6 цифр фракции и использовать режим HALF_UP.
  • Вы хотите отображать только первые две цифры фракции (я не понимаю, почему, но я не стану подвергать сомнению это).

В этом случае я предлагаю вам сначала использовать BigDecimal для закругления, так как в противном случае вы можете получить точные ошибки:

double value = 1.23456789; 
BigDecimal rounded = BigDecimal.valueOf(value).setScale(6, RoundingMode.HALF_UP); 

Это должно привести к значению 1.234568.

Затем используйте NumberFormat, как вы делали, но всегда округлить:

DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US); 
df.applyPattern("#.##"); 
df.setRoundingMode(RoundingMode.DOWN); 
String output = df.format(rounded); 

Это должно привести к 1.23.

С вашим входным значением 4.23499999999235 вы получите 4.235000 (округлые до 6 цифр) и 4.23.

Edit: Я не знаю ни одного режима округления, что округляется 4.23499999999235 к 4.24 но вы должны быть в состоянии достичь его, приковав Множественные setScale() вызовов:

BigDecimal rounded = BigDecimal.valueOf(value); 
for(int digit = 6; digit >= 2; digit--) { 
    rounded = rounded .setScale(digit, RoundingMode.HALF_UP); 
} 

, которые должны применяться округление к фракции цифры 6, затем 5 и т. Д. И, наконец, округлить до 4.24. Я все еще не уверен, что это правильный путь к раунду, но вы знаете свои требования лучше меня :)

+0

Кажется, это правильная идея. Но мне все равно нужно использовать HALF_UP. Тогда результат будет 4.24, что я хотел. Я уточнил это, отредактировав вопрос, также используя другое число (реальный пример от отладки). – Jens

+0

@Jens, возможно, вы захотите изменить свой вопрос еще раз, так как '828.xx' не будет округлять до' 4.23' в любом случае;) – Thomas

+0

@Jens видит мое редактирование хотя бы для одного раунда, как описано. – Thomas

0

Учитывая вы выводя это в строку, то почему бы не использовать

String output = String.format(java.util.Locale.US,"%.2f", doubleValue); 

вместо все DecimalFormat вещи? Это оставит doubleValue в качестве исходного значения, сохраняя точность.

+0

Даже это сокращает мой пример кода, он ничего не изменит. Строковый «вывод» будет содержать число, которое не округлено с точностью более 2 цифр. Строковый формат будет просто смотреть на позицию 3 и раунд 4, вместо того, чтобы рассматривать все эти 9999. – Jens

+0

Итак, вы хотите, чтобы 4.2349999 «округлился» до 4.24? Это похоже на то, что вы просто округлили неправильно. В противном случае я бы сделал то, что вы сделали, и округлил от более высоких до более низких цифр, пока не достиг 2. – igoldthwaite

+0

Я думаю, что это не неправильное округление. Например, финансовые системы часто являются препятствием для вычисления всего с точностью до 6 цифр, но только для двух цифр. Но для финансовых целей вы также используете BigDecimal. – Jens

Смежные вопросы