Kodumuzda int'e dönüştürmemiz gereken bir çiftimiz var.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
Biri bana nedenini açıklayabilir i1 != i2
mi?
Aldığım sonuç şudur: i1 = 9
ve i2 = 8
.
Kodumuzda int'e dönüştürmemiz gereken bir çiftimiz var.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
Biri bana nedenini açıklayabilir i1 != i2
mi?
Aldığım sonuç şudur: i1 = 9
ve i2 = 8
.
Yanıtlar:
Çünkü Convert.ToInt32
mermi:
Dönüş Değeri: en yakın 32 bitlik işaretli tam sayıya yuvarlanır. Değer iki tam sayının ortasındaysa, çift sayı döndürülür; yani 4.5, 4'e ve 5.5, 6'ya dönüştürülür.
... alçı kesilirken :
Double veya float değerden integral türe dönüştürdüğünüzde, değer kesilir.
Güncelleme: Ek farklılıklar için aşağıdaki Jeppe Stig Nielsen'in yorumuna bakın (ancak score
burada olduğu gibi gerçek bir sayı ise oyuna girmez ).
score
idi 8.5
yerine 8.6
. Cevabı alıntıları içerecek şekilde güncelledim. Giriş için teşekkürler.
score
olduğunu NaN
ya bir sonsuzluk ya sonlu ama dışarıda aralığı Int32
, daha sonra Convert.ToInt32
bir özel durum oluşturur. Oyuncular bir döndürür int
, ancak hangisinin olduğunu (benim uygulamamda olduğunu Int32.MinValue
) bilemezsiniz çünkü unchecked
bağlam içindesiniz . ( checked
Bağlam içinde olursanız , bu durumlarda oyuncu kadrosu da bir istisna oluşturacaktır.)
Double
tip numarası 10000000000.6
(on milyar nokta altı) "gerçek" bir sayıdır. Bunun int
üzerine bir cast kullanmak garip bir sonuç verecektir ( checked
bağlam içinde değilseniz , ancak muhtemelen değilsiniz).
Kullanmak, ondalık noktadan sonraki her şeyi yok sayar, dolayısıyla 8.6, 8 olur.
Convert.ToInt32(8.6)
çiftinizin en yakın tam sayıya yuvarlanmasını sağlamanın güvenli yoludur, bu durumda 9.
Verilen örnekte ondalık değeriniz 8.6'dır . 8.5 veya 9.5 olsaydı, i1 == i2 ifadesi doğru olabilirdi. Aslında, 8.5 için doğru ve 9.5 için yanlış olurdu.
Açıklama:
Ondalık kısım ne olursa olsun, ikinci ifade int i2 = (int)score
ondalık kısmı atacak ve size tamsayı kısmını döndürecektir. Veri kaybı olabileceği için yapılması oldukça tehlikeli bir şey.
Şimdi, ilk ifade için iki şey olabilir. Ondalık kısım 5 ise, yani yarı yolda ise, bir karar verilmelidir. Yukarı mı yoksa aşağı mı yuvarlıyoruz? C # 'de, Convert sınıfı bankerin yuvarlamasını uygular. Daha derin açıklama için bu yanıta bakın . Basitçe söylemek gerekirse, sayı çift ise aşağı yuvarlayın, tek sayı ise yukarı yuvarlayın.
Örneğin şunları düşünün:
double score = 8.5;
int i1 = Convert.ToInt32(score); // 8
int i2 = (int)score; // 8
score += 1;
i1 = Convert.ToInt32(score); // 10
i2 = (int)score; // 9
ToInt32 mermi. İnt'e çevrim, tamsayı olmayan bileşeni atar.
Math.Truncate(score)
niyeti daha açık bir şekilde ifade eder(int)score