Целочисленный идентификатор округляется в компоненте Vue

#laravel #vue.js #inertiajs

#laravel #vue.js #inertiajs

Вопрос:

У меня есть приложение Laravel, которое выдает 17-значные (64-разрядные) числовые идентификаторы (laravel-snowflake)

Когда эта коллекция отображается в инерционном компоненте Vue в качестве реквизита, последние 2 цифры округляются до ближайших 10.

37648503920529408 округляется до 37648503920529410

37648503945695232 округляется до 37648503945695230

Это происходит не всегда, но для большинства идентификаторов.

Я выгрузил коллекцию через каждый класс конвейера, и она всегда соответствует базе данных, только когда она попадает в Vue, идентификаторы округляются.

Есть какие-либо объяснения этому?

Комментарии:

1. Это потому, что ваш идентификатор является числовым представлением, а не строкой, а числовое представление в JS ограничено, Number.MAX_SAFE_INTEGER что 9007199254740991 равно. Ваше 17-значное число превышает этот диапазон. Решение состоит в том, чтобы приводить не к числу, а к строке.

2. АГА. Я знал, что это должно было быть что-то вроде этого. Я нигде не смог найти это задокументировано. Значит, если я изменю это значение на 15 или 16 цифр, я смогу сохранить его как число? Увижу ли я какую-либо разницу в производительности, преобразующую это в строку? Должен ли я выбрать другой метод для генерации идентификаторов?

3. Есть ли способ сообщить Javascript преобразовать это в BigInt? Это BigInteger в MySQL.

4. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

5. Для начала нет причин приводить его к числу, поскольку вы, я полагаю, никогда не собираетесь использовать идентификатор для числовых операций.