Поплавок округляется до 2 десятичных знаков java

Я пытаюсь объединить float до 2 десятичных знаков.

У меня есть 2 значения float:

1.985
29.294998

Оба они должны быть округлены, поэтому я получаю следующее:

1.99
29.30

Когда я использую следующий метод:

public static Float precision(int decimalPlace, Float d) {

    BigDecimal bd = new BigDecimal(Float.toString(d));
    bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
    return bd.floatValue();
  }

Результат:

1.99
29.29

Ответ 1

Поскольку вы используете BigDecimal.ROUND_HALF_UP, 29.294998 округляется до 29.29. Вместо этого вы можете использовать BigDecimal.ROUND_UP.

Проверьте BigDecimal doc для получения дополнительной информации о каждом доступном округлении.

Ответ 2

Вместо этого

bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);

Используйте

bd = bd.setScale(decimalPlace, BigDecimal.ROUND_CEILING);

О ROUND_CEILING

Округление режима округляется до положительной бесконечности. Если BigDecimal положительный, ведет себя как ROUND_UP; если отрицательный, ведет себя как ОКРУГЛИТЬ. Обратите внимание, что этот режим округления никогда не уменьшает рассчитанное значение.

Вы можете использовать DecimalFormat, если хотите.

Ответ 3

Поскольку вы всегда хотите округлить, то вы просто не BigDecimal.ROUND_HALF_UP, а вместо этого BigDecimal.ROUND_UP или BigDecimal.ROUND_CEILING.

Используйте BigDecimal.ROUND_UP, если вы хотите, чтобы отрицательные числа округлились (-29.294998 до -29.30).
Используйте BigDecimal.ROUND_CEILING, если вы хотите, чтобы отрицательные числа округлились (-29.294998 до -29.29).

При положительных числах они будут делать округление, которое вы пытаетесь сделать (например, округлить)

Ответ 4

Используется ROUND_HALF_UP, когда вы должны использовать ROUND_UP. ROUND_HALF_UP округляет до ближайшего числа с заданной точностью, округляя до разрыва связей (например, 1.235 раундов до 1.24)

Ответ 5

ROUND_HALP_UP

Режим округления для округления к "ближайшему соседу", если оба соседства не находятся на равном расстоянии, и в этом случае округлите вверх. Ведет себя так же, как RoundingMode.UP, если отброшенная фракция равнa > 0,5; в противном случае, ведет себя как RoundingMode.DOWN. Обратите внимание, что это режим округления, обычно преподаваемый в школе.

Одна из проверок, которые сделаны, - это то, что величина оставшегося остатка (2 * 4998) больше, чем делитель (10000). В этом случае он не настолько уверен, что будет ближе к нижнему концу. Если вы попробуете 29.295001, округлите до 29.3 для ROUND_HALP_UP.