Şimdi eğer tüm değişkenler yazımı okuduysanız, aklınızda şu soru canlanmış olabilir; double da noktalı sayı decimal da float da bunlar arasında nasıl tercih yapmalıyım hangisi ne zaman daha uygun?
Eğer böyle bir soruyla karşılaştıysanız şart bloklarına girmeden önce bu konuyu bir aydınlatalım.
Hemen double ile başlayalım.
Bütün değişkenler bellekte yer kaplar ve siz bellekte ne kadar yer kapladıklarını görebilirsiniz, size şimdi burada bir tablo paylaşıp bütün değişkenlerin ne kadar byte yer kapladıklarını gösterebilirdim fakat ben bunların ezbere dayalı bir yaklaşım olduğunu düşünüyorum, bundan ötürü balık nasıl tutulur ona bakacağız.
sizeof() c# kendi içerisinde bütün değişkenlerin bellekteki boyutlarını görebilmemiz için bu fonksiyonu oluşturmuş, içerisine yazmış olduğumuz değişken tipinin bellekteki kapladığı yeri gösterir.
kullanım şekli yukarıdaki gibidir yukarıdaki kodu çalıştırdığınızda ;
Gördüğünüz gibi ekrana sadece 4 yazdırdı peki bu 4 nedir?
Bu 4 double değişkeninin bellekteki kapladığı byte sayısına tekabül ediyor.
Her byte da 8 adet biti temsil ediyor bit dediğimiz değişkenler 0 ve 1 lerden oluşmakta sadece 0 ve bir yani biz double d=1.3d; diye bir değişken oluşturduğumuzda ve hepimizin de bildiği gibi bilgisayarlar sadece 0 ve 1lerden anlayacağına göre bellekte bunun 0 ve bir karşılığı olacak. Yani bellekte sayımız direkt olarak 1.3 şeklinde saklanmıyor.
Peki nasıl saklanıyor tabiki de 0 ve birlerle peki bir double sayısına en fazla ne kadar büyük bir sayı atayabiliriz diye sorarsanız bu oluşturulan bitlerin tamamına 1 yazdığınızda çıkan sonuç kadar aslında, o da şöyle hesaplanıyor efendim örneğin 101 sayısını ele alalım
sağdan başlayarak sayıları ele alıyorum 1 sayısını 2üzeri0 ile çarpıyoruz 0 sayısını ise 2 üzeri 1 sonra 0’ın solundaki 1 sayısını da 2üzeri 2 ile çarpıyoruz ve bu çıkan sonuçları toplarsak elimizde 5 cevabını elde ediyoruz.
Peki efendim ben gidip 4 adet byte değişkeninin hepsini 1 yapıp çarpacak mıyım?
Tabiki de hayır bunun için de oluşturulmuş olan bir fonksiyon mevcut
Eğer siz double.MaxValue derseniz double içerisine alabileceği en yüksek sayıyı görürsünüz.
Fakat gördüğünüz gibi bizim çıktımız keskin değil yani bir yerden sonra E yazıyor ve devamını göstermiyor gösteremez miyiz?
Eğer biz stringimizi formatlarsak yani string interpolation ile $”{double.MaxValue:N0}” dersek ekrana tamamını yazdırabiliyoruz gördüğünüz gibi sayılar hep virgülle ayrılmış bu virgüllü bir sayı olduğu için değil bunun temel sebebi avrupa bölgelerinde her 3 basamakta bir , koyuluyor bizde ise . yani yukarıdaki sayı çok büyük bir sayı
biz istersek aynı zamanda double.MinValue diyerek en ufak değerini de yazdırabiliriz.
Orasını da size bırakıyorum en ufak değeri kendi bilgisayarınızda ekrana yazdırabilirsiniz.
Peki tek fark bu mu ? Sadece bellekteki kapladıkları boyut mu ? Tabiki de değil.
double ifadeler karşılaştırma için uygun değildir ve hata yapmanıza olanak sağlayabilir,
Örneğin 0.1 sayısını 10 kere toplarsam almam gereken sonuç muhtemelen 1.0 olmalıdır
Yukarıdaki kodun çıktısı aşağıdaki gibi olacaktır
Yani eğer siz karşılaştırma işlemi yapsaydınız beklentiniz muhtemelen sum==1.0 ‘ı doğru olarak kabul edecektiniz fakat sonu öyle değil! double ifadeleri genellikle bilimsel terimler ile kullanılır ve eğer siz karşılaştırma yaparken eşitlik yerine küçüklüğü veya büyüklüğü kullanacaksanız double sizin vazgeçilmeziniz olmalı fakat küçük eşittir veya büyük eşittir ifadeleri buna geçerli değil!
Ayrıca sadece double ile kullanabileceğiniz bir çok değer var bunların ekran görüntüsü aşağıdadır lütfen çıktılarını kendi bilgisayarınızda deneyiniz.
Gelelim float ‘a
İlk önce boyut karşılaştırması yapalım bakalım float bellekte ne kadar yer kaplıyor
A a o da ne double ile aynı yer kaplıyor peki max value’si ne imiş ona bakalım.
Gördüğünüz gibi double ile arasında dağlar kadar fark var hatta double’ın ekran görüntüsünü aldığımda o kadar uzun oldu ki alan fotoğraf küçücük kaldı, yani buradan anlamanız gereken olay eğer siz gerçekten çok yüksek sayılar ile çalışacaksanız double kullanabilirsiniz. Yükseklikten kastım illa büyük olmasına gerek yok sayı değeri çok düşük de olacaksa double tercih edebilirsiniz. Gelelim karşılaştırma işlemlerine
double ile denediğimizin aynısını denersek sonuç gene 1.0 olmuyor yani eşitlik işlemleri ile karşılaştırma yapacaksak gene float’ı kullanmaktan çekinmeliyiz. Not: Bu örnekleri veriyorum fakat bunlar aşırı karmaşık işlemlerinizde sorun çıkarması yüksek ihtimaller olduğundan ve tür farklarını daha rahat anlatabilmek açısından, iki sayı toplayıp işlemi doğru yapıyor demeyin lütfen.
Peki biz hem virgüllü sayı kullanıp hem de adam akıllı sonuçlar alamaz mıyız? Alamayız diyomuşum, şaka şaka.
Kurtarıcımız decimal;
Eğer siz virgüllü sayılarla çalışmak isteyip kesin ve doğru kararlar almak istiyorsanız decimal’ı tercih etmelisiniz, gelelim decimal’ın kapladığı bellek boyutuna.
Evet bu kısımda elleri terletelim biraz kendi bilgisayarımızda sizeof fonksiyonu ile boyutu yazdıralım,
Yazdırdık mı ?
Evet 16 byte, decimal kullanmak gerçekten maliyetli , fakat şöyle keskin sonuçlar çıkartabiliyor.
Eğer bu kodu yazdıracak olursanız ekrana 1.0 yazdıracaktır, çekinmeyelim deneyelim lütfen.
Evet bu virgüllü sayılar arasındaki farklara deyindik ve inceledik.
Siz diğer bütün değişkenlerin en fazla sahip olabileceği değerlere ve en küçük sahip olabileeceği değerlere bakabilirsiniz.
Elleriniz kirletin biraz. Klavye sesi duymak iyi gelebilir =)