Поплавок округляется до 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.