Типы данных для хранения денежных значений на Laravel
Инвестиционный проект. Бэкенд - Laravel 8. база - Mysql. Все числа в одной валюте - доллары.
Сначала было так в миграциях:
$table->float('balance')->default(0);
$table->float('amount')->nullable();
Привело к тому, что при выводе, там где требуется какой-то подсчет, начали проскакивать числа типа: 10.199999999 или 10,100000002
Вопрос как правильно исправить.
Делаю новую миграцию, все поля, которые касаются денег привожу к decimal:
$table->decimal('balance', 13, 2)->default(0)->change();
$table->decimal('amount', 13, 2)->change();
Теперь данные считаются правильно, но почему-то в json`ах отдаются в виде строки "10.20"
Получается теперь надо прописать касты, типа:
protected $casts = [
'balance' => 'float',
];
А в кастах какой тип данных указывать? если float - не получается ли это шило-на-мыло? Хотя так стало всё корректно отображаться, и возвращается уже не строкой, а правильно - числами.
Или float тут тоже может привести к казусам?, и нужно в кастах сделать decimal, типа:
protected $casts = [
'balance' => 'decimal:13,2',
];
Вроде как так будет медленнее, особенно если куча данных.. на сколько медленнее?
Может есть смысл в кастах указать поменьше число, типа decimal:8,2. В базе на всякий случай указал 13,2 - что пока избыточно, но в будущем может и нужно будет.
Подскажите, как правильно?
Еще есть вариант использования int - т.е. хранить в центах, и потом как-то в коде преобразовывать.. но это видится чем-то уж очень сложным.. проект уже действующий, переписывать везде будет сложно.