У нас с JS есть общая тайна - мы оба не разбираемся в больших числах

У нас с JS есть общая тайна - мы оба не разбираемся в больших числах Разработка, Javascript, Json, IT юмор, Программирование
У нас с JS есть общая тайна - мы оба не разбираемся в больших числах Разработка, Javascript, Json, IT юмор, Программирование

P.S. JS не поддерживает целочисленные типы, все числа являются number, который по факту double, поэтому самый большой int который JS может сохранить без потери точности - 2^53 - 1

Никаких ошибок при попытке обработать слишком большое число не будет - оно просто сконвертируется в ближайшее представимое double (удачного дебага, если это ID в базе)

То же касается JSON - как формат, он не содержит точных требований как обрабатывать числа - всё number и зависит от имплементации. Какие-то языки и библиотеки различают int и double автомагически, какие-то всё интерпретируют как double, какие-то падают на конверсии.

1
Автор поста оценил этот комментарий
Как выкрутились?
раскрыть ветку (1)
5
Автор поста оценил этот комментарий

все числа строками, в самом js есть явный тип bigint и библиотечки для big decimal и прочего

показать ответы
3
Автор поста оценил этот комментарий

Почему? В данном примере всё довольно логично и предсказуемо, в том смысле, что язык некорректно работает с невалидными данными. Например, в каких-нибудь плюсах можно тоже поиметь проблем с переполнением. Про допустимый диапазон значений number пишут в каждой 2 статье для новичков. Единственный косяк именно джаваскрипта (а не кривой реализации браузеров, привет сафари ебаное), который можно отнести к "магии" - это typeof null == object, про что тоже знает каждая собака

раскрыть ветку (1)
4
Автор поста оценил этот комментарий

Единственный косяк именно джаваскрипта (а не кривой реализации браузеров, привет сафари ебаное), который можно отнести к "магии" - это typeof null == object

https://262.ecma-international.org/6.0/#sec-typeof-operator-...


Всё по спеке. И typeof null, и number который инты херит. Всё по спеке, просто спека г-но =)

показать ответы
Автор поста оценил этот комментарий
Блин. Дорогой ТС, как въехать в эту хрень? Есть необходимость прокачать навык чтения кода и понимания каких-то базовых основ программирования, но я хз, с чего вообще начать (((
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Зависит от стартового уровня. Но главное практика (если с постановкой задач проблема - можно начать в любом интерактивном учебнике)

Автор поста оценил этот комментарий

Нет, это не метаданные. Это часть натурального ключа.

Задача сортировки стоит всегда - это и самой БД нужно для эффективного индексирования, это и возрастающие индексы для восстановления порядка операций. Работать с ним везде как со структурой (т.е. явно передавать N чисел) или строкой просто неэффективно на больших объёмах плюс затрудняет ряд промежуточных сервисов, где в принципе эта инфа просто хранится as is и бегает туда-сюда (да-да, из-за JS она теперь бегает как строка, но для текстового формата обмена это пара кавычек лишних, пофик). Т.е. условному саппорту знать, что там внутри, не нужно - для них это число, оно уникально, всё. Аналогично с 3rd party и внутренними сервисами, которые делают аналитику, начисления через двухфазный коммит и т.п.

раскрыть ветку (1)
Автор поста оценил этот комментарий

прикинул на пальцах примерчик с номером карты

16-значный номер умещается в 54 бита

дата истечения (4 цифры) ещё 10 бит

Итого номер + дата истечения = одно 64-битное целое (8 байт).

Если строкой - это 20 байт.


При этом в номере карты есть - номер платёжной системы, БИК банка, номер самой карты и контрольные разряды для UX (при вводе вручную ошибка в паре цифр не страшна и может быть провалидирована на UI)


Вот что-то похожее было у нас с transaction id и почему это было число и почему его подрезание привело к проблемам.

Автор поста оценил этот комментарий

Зачем нужно переводить это число в инт если не стоит задача сортировки например? Ведь если есть биты маршрутизации то это уже просто метаданные

раскрыть ветку (1)
Автор поста оценил этот комментарий

Нет, это не метаданные. Это часть натурального ключа.

Задача сортировки стоит всегда - это и самой БД нужно для эффективного индексирования, это и возрастающие индексы для восстановления порядка операций. Работать с ним везде как со структурой (т.е. явно передавать N чисел) или строкой просто неэффективно на больших объёмах плюс затрудняет ряд промежуточных сервисов, где в принципе эта инфа просто хранится as is и бегает туда-сюда (да-да, из-за JS она теперь бегает как строка, но для текстового формата обмена это пара кавычек лишних, пофик). Т.е. условному саппорту знать, что там внутри, не нужно - для них это число, оно уникально, всё. Аналогично с 3rd party и внутренними сервисами, которые делают аналитику, начисления через двухфазный коммит и т.п.

показать ответы
Автор поста оценил этот комментарий

А откуда такие большие id взялись?

раскрыть ветку (1)
Автор поста оценил этот комментарий

ЕМНИП кейс был с transaction id, которые включали биты для маршрутизации и шардирования, а потому в определённый момент "лимит" на инты был исчерпан. Детали не помню, но условно 32 бита были под шардирование и для JS в неудачном шарде поместится всего 1млн транзакций.

показать ответы