Как стать автором
Обновить

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

В каких случах по Вашему мнению лучше всего подходит BigInt?
Собственно, про это уже писали:
— для больших числовых идентификаторов
— для точных меток времени
— для реализации BigDecimal
При работе с вебсервисами, которые не знают про странные ограничения js.
При работе с RSA, например.
Спасибо за статью, ну тут бы сначала нужно решить проблему с вещественным типом: хранения и отображения данных 0.2 + 0.1 = 0.30000000000000004, 0.2 + 0.1 === 0.3 (false), а то как-то неудобно работать )
А как её можно решить в принципе? Эти особенности у вычислений с плавающей точкой были с рождения.
НЛО прилетело и опубликовало эту надпись здесь
Ну я конечно не спец по компиляторам и хранению данных. Но специально проверил, Visual FoxPro (когда то писал на нем просто много лет) и PostgreSQL работает адекватно, вот пример на PostgreSQL
SELECT 0.1 + 0.2, 0.1 + 0.2 = 0.3
-------------------------------------
0.3 true
Ну так там 0.1 — это numeric, а не real. То есть используется фиксированная точка, а не плавающая.

psql просто округлил число при выводе.

А false округлил до true.

НЛО прилетело и опубликовало эту надпись здесь
BigDecimal на базе BigInt :)
Это проблема вообще не решаема, так как 0.3 нельзя представить как конечное число в двоичном виде. Например, представьте что вы храните числа в ячейке из 5 десятичных разрядов. Как вы в нем запишите 1/3 = 0,(3)? 0.3333? 0.3334? спойлер, никак) Вот точно так же в конечном двочином значении невозможно записать некоторые конечные десятичные числа
Вообще-то решаема, но очень сложно, созданием новой арифметики вычислений. Хранить такие числа например как (очень грубо говоря) строки типа «1/3».
Вот, кажется, даже реализация есть на PHP:
github.com/brick/math
нерешаема при сохранении скорости вычислений как у double, если быть точнее
Какой прок в быстром вычислении того, что 0.3 * 3 + 0.1 !== 1?

Статья отличная, язык ***** [очень сложный, противоречивый, с большим количеством неверных решений, которые приходится поддерживать].

Отдельно хотелось бы добавить еще ложечку дегтя: bigint вызывает ошибку сериализации при JSON.stringify:

let data = { x: 1n };
JSON.stringify(data); // TypeError: Do not know how to serialize a BigInt

В этом тоже есть некоторая здравость… даа. Придется использовать внешние либы.
В этом тоже есть некоторая здравость

Как я понимаю, json никак не ограничивает точность сериализуемых значений, можно написать хоть {"a": 10000000[ещёстонулей]0000001}, то есть сериализовать BigInt проблемы нет вообще. То есть текст ошибки очевидно врёт.


Проблема в том, что не ясно, как десериализовать конкретное значение, в Int или BigInt, а так как два этих типа абсолютно не взаимозаменяемы, то результат десериализации будет не равен результату сериализации, поэтому сериализацию BigInt решили запретить.

Спасибо! Согласен, что проблема именно в десериализации. Просто защитились от возможной неоднозначности еще одним TypeError.

Симметричность JSON.parse/stringify уже и так нарушается, если присутствует объект Date, например. Так что непонятно, почему для BigInt это стало внезапно важно

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории