Кейс: есть работа с денежными средствами в приложении. Проблема: старые добрые округления типа 0.01 + 0.02. Решения:
- Хранить и работать с int. Но это не дает 100% надежность. Допустим, мы применяем скидку к стоимости товарной позиции и получаем 100.123 в копейках. Что делать с .123? Отбрасывать? Таким образом мы постепенно накапливаем погрешности округления. Можно было не переходить на int, а просто постоянно использовать round(n, 2)
- Взять BCMath. Уже лучше, но можем получить в бд те же самые 100.123.
- Взять BCMath, написать тип для доктрины. Ключевая задумка: НЕ ОКРУГЛЯТЬ ничего до момента записи в бд / вывода в api. https://gist.github.com/ancient-web/f907cb63312c8ab0fe834603f4bfb6bb - пример типа.