Вопрос-ответ

How to round a number to n decimal places in Java

Как округлить число до 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:

DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);

ВОЗВРАТ:

0.91238

Однако, как вы можете видеть, здесь используется округление наполовину поровну. То есть оно будет округлено в меньшую сторону, если предыдущая цифра четная. Чего бы я хотел, так это:

0.912385 -> 0.91239
0.912300 -> 0.9123

Каков наилучший способ добиться этого в Java?

Переведено автоматически
Ответ 1

Используйте setRoundingMode, установите RoundingMode явно, чтобы решить вашу проблему с округлением наполовину поровну, затем используйте шаблон форматирования для требуемого вывода.

Пример:

DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) {
Double d = n.doubleValue();
System.out.println(df.format(d));
}

выдает результат:

12
123.1235
0.23
0.1
2341234.2125

РЕДАКТИРОВАТЬ: исходный ответ не касается точности значений double. Это нормально, если вам все равно, округляется ли оно в большую или меньшую сторону. Но если вы хотите точное округление, то вам нужно учитывать ожидаемую точность значений. Значения с плавающей запятой имеют внутреннее двоичное представление. Это означает, что значение типа 2.7735 на самом деле не имеет такого точного внутреннего значения. Оно может быть немного больше или немного меньше. Если внутреннее значение немного меньше, то оно не будет округляться до 2.7740. Чтобы исправить эту ситуацию, вам необходимо знать точность значений, с которыми вы работаете, и добавлять или вычитать это значение перед округлением. Например, если вы знаете, что ваши значения имеют точность до 6 цифр, то для округления наполовину увеличенных значений добавьте эту точность к значению:

Double d = n.doubleValue() + 1e-6;

Чтобы округлить в меньшую сторону, вычтите точность.

Ответ 2

Предполагая, что value равно double, вы можете сделать:

(double)Math.round(value * 100000d) / 100000d

Это для точности в 5 цифр. Количество нулей указывает на количество десятичных знаков.

Ответ 3
new BigDecimal(String.valueOf(double)).setScale(yourScale, BigDecimal.ROUND_HALF_UP);

вы получитеBigDecimal. Чтобы получить из него строку, просто вызовите этот метод BigDecimal's toString или toPlainString метод для Java 5+ для строки простого формата.

Пример программы:

package trials;
import java.math.BigDecimal;

public class Trials {

public static void main(String[] args) {
int yourScale = 10;
System.out.println(BigDecimal.valueOf(0.42344534534553453453-0.42324534524553453453).setScale(yourScale, BigDecimal.ROUND_HALF_UP));
}
Ответ 4

Вы также можете использовать

DecimalFormat df = new DecimalFormat("#.00000");
df.format(0.912385);

чтобы убедиться, что у вас есть конечные 0.

java