Типы данных для хранения денежных значений на 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 - т.е. хранить в центах, и потом как-то в коде преобразовывать.. но это видится чем-то уж очень сложным.. проект уже действующий, переписывать везде будет сложно.


Ответы (0 шт):