Comments 24
В каких случах по Вашему мнению лучше всего подходит BigInt?
0
Спасибо за статью, ну тут бы сначала нужно решить проблему с вещественным типом: хранения и отображения данных 0.2 + 0.1 = 0.30000000000000004, 0.2 + 0.1 === 0.3 (false), а то как-то неудобно работать )
0
А как её можно решить в принципе? Эти особенности у вычислений с плавающей точкой были с рождения.
+7
UFO just landed and posted this here
Ну я конечно не спец по компиляторам и хранению данных. Но специально проверил, Visual FoxPro (когда то писал на нем просто много лет) и PostgreSQL работает адекватно, вот пример на PostgreSQL
SELECT 0.1 + 0.2, 0.1 + 0.2 = 0.3
-------------------------------------
0.3 true
0
UFO just landed and posted this here
BigDecimal на базе BigInt :)
0
Это проблема вообще не решаема, так как 0.3 нельзя представить как конечное число в двоичном виде. Например, представьте что вы храните числа в ячейке из 5 десятичных разрядов. Как вы в нем запишите 1/3 = 0,(3)? 0.3333? 0.3334? спойлер, никак) Вот точно так же в конечном двочином значении невозможно записать некоторые конечные десятичные числа
+1
Вообще-то решаема, но очень сложно, созданием новой арифметики вычислений. Хранить такие числа например как (очень грубо говоря) строки типа «1/3».
Вот, кажется, даже реализация есть на PHP:
github.com/brick/math
Вот, кажется, даже реализация есть на PHP:
github.com/brick/math
-1
нерешаема при сохранении скорости вычислений как у double, если быть точнее
+3
вот предложение Dr. Axel Rauschmayer по этому поводу
+1
Какой прок в быстром вычислении того, что 0.3 * 3 + 0.1 !== 1?
-1
+2
Статья отличная, язык ***** [очень сложный, противоречивый, с большим количеством неверных решений, которые приходится поддерживать].
+1
Отдельно хотелось бы добавить еще ложечку дегтя: bigint вызывает ошибку сериализации при JSON.stringify:
В этом тоже есть некоторая здравость… даа. Придется использовать внешние либы.
let data = { x: 1n };
JSON.stringify(data); // TypeError: Do not know how to serialize a BigInt
В этом тоже есть некоторая здравость… даа. Придется использовать внешние либы.
+1
В этом тоже есть некоторая здравость
Как я понимаю, json никак не ограничивает точность сериализуемых значений, можно написать хоть {"a": 10000000[ещёстонулей]0000001}
, то есть сериализовать BigInt проблемы нет вообще. То есть текст ошибки очевидно врёт.
Проблема в том, что не ясно, как десериализовать конкретное значение, в Int или BigInt, а так как два этих типа абсолютно не взаимозаменяемы, то результат десериализации будет не равен результату сериализации, поэтому сериализацию BigInt решили запретить.
+6
Sign up to leave a comment.
JavaScript: Большое целое Ну почему