Как округлить число
Округление до целого по школьным правилам — Math.round, вниз — Math.floor, вверх — Math.ceil:
public class Main {
public static void main(String[] args) {
System.out.println(Math.round(2.5));
System.out.println(Math.round(2.4));
System.out.println(Math.round(-2.5));
System.out.println(Math.floor(2.7));
System.out.println(Math.ceil(2.1));
System.out.println((int) 2.99);
}
}3
2
-2
2.0
3.0
2Math.roundпри ровно .5 округляет вверх, к большему числу: 2.5 → 3, а −2.5 → −2.Math.floorиMath.ceilвозвращаютdouble, поэтому выводятся с.0.(int)просто отбрасывает дробную часть, это не округление.Math.round(double)возвращаетlong. Строкаint r = Math.round(x);не скомпилируется — нужноint r = (int) Math.round(x);.
До двух знаков после запятой
Если нужно только вывести число красиво — округляет printf или String.format:
System.out.printf("%.2f%n", 3.14159);Выведет 3.14 или 3,14 — разделитель зависит от языка системы. Чтобы всегда была точка, укажите язык: String.format(Locale.US, "%.2f", x) (нужен import java.util.Locale;).
Если нужно число с двумя знаками для дальнейших расчётов:
public class Main {
public static void main(String[] args) {
double x = 3.14159;
double rounded = Math.round(x * 100) / 100.0;
System.out.println(rounded);
}
}3.14Число умножается на 100, округляется до целого и делится обратно. Делить нужно на 100.0, а не на 100: иначе деление целых отбросит дробную часть. Для трёх знаков — 1000 и 1000.0.
Точно, для денег: BigDecimal
Дробные double хранятся в двоичном виде приблизительно, и на границе .5 округление может «промахнуться». Для денег и всего, где важна каждая копейка, есть класс BigDecimal:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal exact = new BigDecimal("2.675");
BigDecimal fromDouble = new BigDecimal(2.675);
System.out.println(exact.setScale(2, RoundingMode.HALF_UP));
System.out.println(fromDouble.setScale(2, RoundingMode.HALF_UP));
}
}2.68
2.67setScale(2, RoundingMode.HALF_UP) оставляет два знака и округляет по школьному правилу. Создавайте BigDecimal из строки: число 2.675 в double на самом деле чуть меньше — 2.67499999…, и из него получается 2.67.
Подводные камни
Math.round(x * 100) / 100без.0даёт целое число — частая ошибка.Math.rintокругляет .5 к ближайшему чётному:Math.rint(2.5)— 2.0. Если нужно школьное правило, беритеMath.round.- Округление до десятков:
Math.round(x / 10.0) * 10— 1234 → 1230.