Как округлить число до n знаков после запятой в Java
Что я хотел бы, так это метод преобразования double в строку, который округляется с использованием метода half-up - т. е. Если округляемая десятичная дробь равна 5, она всегда округляется до следующего числа. Это стандартный метод округления, которого большинство людей ожидают в большинстве ситуаций.
Я также хотел бы, чтобы отображались только значащие цифры, т. Е. Не должно быть никаких завершающих нулей.
Я знаю, что один из способов сделать это - использовать String.format метод:
String.format("%.5g%n", 0.912385);
ВОЗВРАТ:
0.91239
это здорово, однако оно всегда отображает числа с 5 знаками после запятой, даже если они не являются значимыми:
String.format("%.5g%n", 0.912300);
ВОЗВРАТ:
0.91230
Другой метод заключается в использовании DecimalFormatter:
Однако, как вы можете видеть, здесь используется округление наполовину поровну. То есть оно будет округлено в меньшую сторону, если предыдущая цифра четная. Чего бы я хотел, так это:
0.912385 -> 0.91239 0.912300 -> 0.9123
Каков наилучший способ добиться этого в Java?
Переведено автоматически
Ответ 1
Используйте setRoundingMode, установите RoundingMode явно, чтобы решить вашу проблему с округлением наполовину поровну, затем используйте шаблон форматирования для требуемого вывода.
Пример:
DecimalFormatdf=newDecimalFormat("#.####"); df.setRoundingMode(RoundingMode.CEILING); for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) { Doubled= n.doubleValue(); System.out.println(df.format(d)); }
выдает результат:
12 123.1235 0.23 0.1 2341234.2125
РЕДАКТИРОВАТЬ: исходный ответ не касается точности значений double. Это нормально, если вам все равно, округляется ли оно в большую или меньшую сторону. Но если вы хотите точное округление, то вам нужно учитывать ожидаемую точность значений. Значения с плавающей запятой имеют внутреннее двоичное представление. Это означает, что значение типа 2.7735 на самом деле не имеет такого точного внутреннего значения. Оно может быть немного больше или немного меньше. Если внутреннее значение немного меньше, то оно не будет округляться до 2.7740. Чтобы исправить эту ситуацию, вам необходимо знать точность значений, с которыми вы работаете, и добавлять или вычитать это значение перед округлением. Например, если вы знаете, что ваши значения имеют точность до 6 цифр, то для округления наполовину увеличенных значений добавьте эту точность к значению:
Doubled= n.doubleValue() + 1e-6;
Чтобы округлить в меньшую сторону, вычтите точность.
Ответ 2
Предполагая, что value равно double, вы можете сделать:
(double)Math.round(value * 100000d) / 100000d
Это для точности в 5 цифр. Количество нулей указывает на количество десятичных знаков.
вы получитеBigDecimal. Чтобы получить из него строку, просто вызовите этот метод BigDecimal's toString или toPlainString метод для Java 5+ для строки простого формата.