Округление и масштаб
Управляйте точностью и режимами округления
«Округление и масштаб» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
scale и precision
У каждого объекта BigDecimal есть scale — количество цифр справа от десятичного разделителя. Значение 12.340 имеет scale, равный 3. Управляя scale, можно отображать деньги ровно с двумя знаками после запятой.
Просмотр scale
Вызовите scale(), чтобы узнать, сколько знаков после запятой хранит значение, а precision() — чтобы получить общее количество значащих цифр.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal v = new BigDecimal("12.340");
System.out.println(v.scale());
System.out.println(v.precision());
}
}setScale для фиксации знаков после запятой
setScale принудительно задаёт выбранное количество знаков после запятой. Если требуется округление, необходимо передать RoundingMode.
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal v = new BigDecimal("12.3456");
System.out.println(v.setScale(2, RoundingMode.HALF_UP));
}
}Обычный режим округления до ближайшего значения
RoundingMode.HALF_UP округляет до ближайшего значения, а при равенстве округляет от нуля. Это обычное округление, которому учат в школе.
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
System.out.println(new BigDecimal("2.5").setScale(0, RoundingMode.HALF_UP));
System.out.println(new BigDecimal("3.5").setScale(0, RoundingMode.HALF_UP));
}
}Округление половинных значений к чётному
HALF_EVEN при равенстве округляет в сторону ближайшей чётной цифры. Это уменьшает смещение при большом количестве округлений, поэтому банки предпочитают такой подход.
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
System.out.println(new BigDecimal("2.5").setScale(0, RoundingMode.HALF_EVEN));
System.out.println(new BigDecimal("3.5").setScale(0, RoundingMode.HALF_EVEN));
}
}CEILING и FLOOR
CEILING всегда округляет к положительной бесконечности, а FLOOR — к отрицательной бесконечности, независимо от удаляемой цифры.
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal v = new BigDecimal("2.1");
System.out.println(v.setScale(0, RoundingMode.CEILING));
System.out.println(v.setScale(0, RoundingMode.FLOOR));
}
}DOWN и UP
DOWN отбрасывает дробную часть в сторону нуля, а UP всегда округляет от нуля. DOWN выполняет простое усечение.
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal v = new BigDecimal("2.9");
System.out.println(v.setScale(0, RoundingMode.DOWN));
System.out.println(v.setScale(0, RoundingMode.UP));
}
}Округление во время деления
Деление может давать бесконечные десятичные дроби, поэтому scale и режим округления указываются прямо в вызове divide.
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal bill = new BigDecimal("100.00");
BigDecimal people = new BigDecimal("3");
System.out.println(bill.divide(people, 2, RoundingMode.HALF_UP));
}
}Удаление завершающих нулей
stripTrailingZeros удаляет лишние нули. Объедините его с toPlainString, чтобы в результате не использовалась экспоненциальная запись.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal v = new BigDecimal("12.300");
System.out.println(v.stripTrailingZeros().toPlainString());
}
}Форматирование денег
Для отображения установите scale, равный 2, и используйте HALF_UP, чтобы цены всегда показывались с двумя знаками после запятой, даже если сумма целая.
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal amount = new BigDecimal("7");
System.out.println(amount.setScale(2, RoundingMode.HALF_UP));
}
}Выбор режима
Выбирайте HALF_UP для обычного округления в пользовательском интерфейсе, а HALF_EVEN — для бухгалтерских расчётов, чтобы уменьшить накопленное смещение. Всегда явно указывайте режим, чтобы код не выдавал ошибку для незавершающихся результатов.
Быстрая проверка
Проверьте свои знания о scale и округлении.
Повторение
Вы научились управлять точностью:
- Scale — это количество цифр после десятичного разделителя
setScaleзадаёт количество знаков после запятой и требуетRoundingModeHALF_UP— обычное округление, аHALF_EVEN— округление половинных значений к чётномуCEILING,FLOOR,UPиDOWNохватывают направленные режимы округления- Всегда указывайте режим при делении, чтобы избежать ошибок
Часто задаваемые вопросы
Урок «Округление и масштаб» бесплатный?
Да — полный текст урока «Округление и масштаб» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Округление и масштаб»?
Управляйте точностью и режимами округления Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Округление и масштаб»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему не стоит использовать double для денег
- Работа с BigDecimal
- Округление и масштаб
- BigInteger для огромных чисел