BigDecimal — это класс для работы с числами высокой точности. Он нужен там, где float и double перестают быть надёжными: например, в финансовых расчётах, налогах или научных задачах.
В отличие от double, BigDecimal не страдает от ошибок округления, вызванных двоичной арифметикой. Он хранит значение точно — в виде строки, которую мы явно передаём:
BigDecimal money = new BigDecimal("123.456");Никогда не создавайте BigDecimal из double, иначе вы получите уже округлённое число.
Класс BigDecimal — immutable: любые операции, как у String, создают новый объект:
BigDecimal result = money.add(BigDecimal.valueOf(10));
Для арифметики используются методы (add, subtract, multiply, divide) — потому что операторы + - * / тут не работают.
Для округления используется setScale() с указанием режима:
money.setScale(2, RoundingMode.HALF_UP);
Это важно: без указания RoundingMode можно получить ArithmeticException, особенно при делении.
И ещё один подводный камень — сравнение:
new BigDecimal("1.5").equals(new BigDecimal("1.50")) // false
new BigDecimal("1.5").compareTo(new BigDecimal("1.50")) // 0equals() сравнивает и значение, и масштаб (scale). А compareTo() сравнивает только числа — и это то, что нужно в большинстве случаев.
Если вы работаете с деньгами, расчётами процентов, скидок, налогов — забудьте про double, вам нужен BigDecimal.
❤ — если было полезно
tags: #обучение
📱 Java Developer | Чат
