Glossary
BigInt
JavaScript'in keyfi hassasiyetli tam sayı türü
By Buğra SözeriPublished Updated
BigInt, ES2020'de keyfi hassasiyette tam sayı aritmetiği için JavaScript'e eklenen bir ilkel türdür. IEEE 754 çift hassasiyetini kullanan ve yaklaşık 2⁵³'ün ötesinde doğruluğu kaybeden normal Number türünün aksine BigInt, herhangi bir büyüklükte tam sayıları temsil edebilir.
Değişmez sözdizimi: bir sayıya n ekleyin ya da BigInt(x) çağrısı yapın. +, -, *, / gibi operatörler çalışır; ancak BigInt'i Number ile karıştıramazsınız — 1n + 1 hata verir. Bölme sıfıra doğru kesilir (tam sayı bölmesi).
BigInt'in önemli olduğu yerler: Ethereum Wei miktarları (ETH başına en fazla 10¹⁸), kriptografik işlemler (RSA anahtarları, ECC), büyük veritabanı kimlikleri (Snowflake, ULID), ölçekte sayaçlar ve kuruşları tam sayı olarak saklayan finansal sistemler.
Wei / Gwei / ETH dönüştürücümüz, 18 haneli Wei miktarlarının kayıp olmadan iletilmesi için BigInt'i boydan boya kullanır.
BigInt'ten önce Number'ın sessizce bozulduğu yer: sınır Number.MAX_SAFE_INTEGER = 2⁵³ − 1 = 9.007.199.254.740.991'dir. Bu değerin üzerinde ardışık tam sayılar artık temsil edilemez — 9007199254740992 ve 9007199254740993 aynı double'a yuvarlanır. BigInt desteğini etkinleştirmeyen JSON ayrıştırıcıları, API'lerden döndürülen büyük kimlikleri (Twitter kar tanesi kimlikleri, 64 bitlik hesaplardaki Stripe nesne kimlikleri, Ethereum miktarları) sessizce bozar. Bozulma sessizdir: hata yok, uyarı yok; sadece farklı bir sayı. JSON.parse, tam sayı dizelerini algılayan ve bunları açıkça BigInt'e dönüştüren bir canlandırıcı işlevle yapılandırılabilir.
BigInt ve serileştirme: JSON.stringify(1n), varsayılan olarak bir TypeError fırlatır — JSON'ın BigInt türü yoktur. Pratik geçici çözüm, BigInt'leri çıkışta ondalık dizeler olarak serileştirmek ve tüketen tarafta geri ayrıştırmaktır; her blockchain RPC API'si bunu yapar (Ethereum hex dizeler, Solana ondalık dizeler döndürür). Çıkışta .toString() ve girişte Number() çağırma cazibesinden kaçının — bu, kayıplı türden geçen bir gidiş-dönüşü tamamlar ve amacı boşa çıkarır. İlgili: IEEE 754 (aynı dilde neden 0,1 + 0,2 !== 0,3), Gwei. Referans: TC39 BigInt teklifi.
Çalışılmış örnek: ETH bakiyesi aritmetiği
Zincir üzerinde 1234567890123456789 Wei olarak saklanan 1,234567890123456789 ETH tutan bir hesabı düşünün. Bir JavaScript Number olarak bu 1234567890123456800 olur — son iki rakam gider. Hata (yaklaşık 11 wei) itibari değer açısından küçüktür; ancak muhasebe mutabakatı sırasında birçok böyle bakiyeyi toplarsanız yuvarlama önyargısı birikir ve zincir dışı defter, zincir üstü gerçekten sapar. BigInt ile: const bal = 1234567890123456789n; const fee = 21000n * 30n * 10n**9n; const net = bal - fee; — wei düzeyinde kesin, kayıp yok. 10n**9n terimi milyardır; gwei'den wei'ye çarpan.
Performans ve tuzaklar
BigInt işlemleri Number'dan yavaştır — operand boyutuna bağlı olarak tipik olarak 10-100 kat — çünkü V8'de tek bir CPU talimatı yerine keyfi hassasiyetli aritmetiğe dokunurlar. Güvenli bir double'a sığan değerler üzerindeki milyonlarca değerin döngüsü için Number ile kalın. Diğer tuzaklar: Math.max, Math.abs, Math.floor BigInt'i reddeder; JSON.stringify hata fırlatır; typeof 1n === "bigint"'tir, "number" değil; < ve === ile türleri karıştırmak şaşırtıcı zorlama kurallarını izler (1n == 1 doğru, 1n === 1 yanlış). MDN'nin BigInt referansı, zorlama tablosunu listeler; daha önce yalnızca Number kullanan bir kod tabanına BigInt eklerken bunu bir kontrol listesi olarak kullanın.
Frequently asked questions
- JavaScript'te BigInt nedir?
- BigInt, keyfi boyutta tam sayıları temsil eden bir JavaScript ilkel türüdür (ES2020'de tanıtılmıştır). 64 bitlik IEEE 754 kayan noktalı bir tür olan ve güvenli biçimde yalnızca 2⁵³−1'e kadar tam sayıları temsil edebilen Number türünün aksine BigInt'in üst sınırı yoktur.
- BigInt pratikte nasıl kullanılır?
- Ethereum token miktarları wei cinsinden saklanır; 1 ETH = 10¹⁸ weidir. Bu 19 haneli sayı, Number'ın güvenli tam sayı aralığını aşar; dolayısıyla ethers.js gibi Ethereum kütüphaneleri tüm zincir üstü aritmetik için BigInt (veya önceki BN.js/JSBI) kullanır.
- JavaScript'te BigInt ile Number arasındaki fark nedir?
- Number, kayan noktalı aritmetik kullanır ve 2⁵³−1 (9.007.199.254.740.991) üzerinde hassasiyetini kaybeder. BigInt, keyfi hassasiyette tam sayı aritmetiği kullanır ve asla hassasiyetini kaybetmez; ancak kesir sayıları temsil edemez. Açık dönüştürme olmadan ikisini aritmetikte karıştıramazsınız.
- BigInt ile ilgili performans takasları var mı?
- Evet — BigInt işlemleri, CPU kayan nokta donanımını kullanamadıklarından Number işlemlerinden önemli ölçüde yavaştır. Number'ın güvenli tam sayı aralığına sığan miktarlar için Number daha hızlıdır; BigInt yalnızca değerler 2⁵³−1'i aştığında gereklidir.
Related
Published May 14, 2026 · Last reviewed May 31, 2026