0.1 + 0.2 neden 0.3 etmiyor?
Konsola `0.1 + 0.2` yaz, `0.3` çıkmaz. Bu bir JavaScript hatası değil — Python'da, Java'da, Go'da da aynı sonucu alırsın. IEEE 754, mantissa ve parayı neden asla float olarak tutmaman gerektiği.

Konsola 0.1 + 0.2 yaz. Çıkan sonuç 0.30000000000000004. Hatalı bir kütüphane
kullanmıyorsun, tarayıcın bozuk değil — ve bu bir JavaScript hatası da değil.
Python'da, Java'da, Go'da, hangi dilde denersen dene aynı sonucu alırsın. Çünkü
hepsi aynı standardı kullanıyor: IEEE 754.
Taban meselesi
Onluk tabanda 1/3'ü tam yazamazsın; 0.333... sonsuza gider. Bilgisayar da
benzer bir sorun yaşıyor, ama ikilik tabanda. 0.1 ikilik tabanda 0.000110011...
şeklinde sonsuza kadar tekrar eden bir kesir. Onluk tabanda basit görünen bir sayı,
ikilik tabanda imkânsız oluyor.
64 bitin sınırı
Bir JavaScript sayısı hafızada 64 bit yer kaplıyor: bir işaret biti, on bir üs
biti, elli iki basamak (mantissa) biti. Sonsuza giden 0.1'in ikilik açılımı bu
elli iki basamakta kesiliyor. Geriye ufacık, gözle görülmeyen bir yuvarlama hatası
kalıyor. 0.1 ve 0.2'nin kendi hataları toplanınca 0.30000000000000004 ortaya
çıkıyor.
Tek işlemde görünmez, milyonda birikir
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // falseTek bir toplamada bu fark hiçbir şeyi bozmaz. Ama bir alışveriş sepetinde yüzlerce toplama, bir muhasebe sisteminde milyonlarca işlem olduğunda bu hata birikir ve bir noktada bir kuruş kaybolur. Muhasebe tutmaz, testler rastgele kızarır.
Kuralı baştan koy: para birimini ondalıklı sayı olarak saklama. Kuruş
(ya da sent) cinsinden tam sayı sakla, ekranda göstermeden hemen önce böl.
Karşılaştırma yapman gerekiyorsa da eşitliği değil, küçük bir toleransı
kontrol et: Math.abs(a - b) < Number.EPSILON.
Kapanış
Bu, mülakatlarda hâlâ sorulan bir soru — ve sebebi rastgele bir kod hatası değil, sayıların bilgisayarda nasıl temsil edildiğiyle ilgili temel bir kısıt. Parayla uğraşan her sistemde bu kuralı baştan kur, sonra unut.
