BigDecimal часто используют для денег, процентов и точных вычислений:
BigDecimal price = new BigDecimal(0.1);
На первый взгляд всё нормально: хотели получить 0.1.
Но double хранит число в бинарном формате, и многие десятичные дроби там не представляются точно. Поэтому BigDecimal получает не “0.1”, а фактическое значение double.
Это легко увидеть:
System.out.println(new BigDecimal(0.1));
Результат может выглядеть примерно так:
0.100000000000000005551115123125...
Для точных десятичных значений лучше передавать строку:
BigDecimal price = new BigDecimal("0.1");Или использовать valueOf(), если значение уже пришло как double:
BigDecimal price = BigDecimal.valueOf(0.1);
valueOf() берёт строковое представление double и обычно даёт ожидаемый десятичный результат.
Особенно важно помнить это в расчётах с деньгами:
BigDecimal total = new BigDecimal("19.99")
.multiply(new BigDecimal("3"));BigDecimal точный, но только если дать ему точное входное значение. Для денег и бизнес-логики не создавай его напрямую из double.
👉 Java Ready | #совет
