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 != i2mi?
Aldığım sonuç şudur: i1 = 9ve 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 != i2mi?
Aldığım sonuç şudur: i1 = 9ve i2 = 8.
Yanıtlar:
Çünkü Convert.ToInt32mermi:
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 scoreburada olduğu gibi gerçek bir sayı ise oyuna girmez ).
scoreidi 8.5yerine 8.6. Cevabı alıntıları içerecek şekilde güncelledim. Giriş için teşekkürler.
scoreolduğunu NaNya bir sonsuzluk ya sonlu ama dışarıda aralığı Int32, daha sonra Convert.ToInt32bir özel durum oluşturur. Oyuncular bir döndürür int, ancak hangisinin olduğunu (benim uygulamamda olduğunu Int32.MinValue) bilemezsiniz çünkü uncheckedbağlam içindesiniz . ( checkedBağlam içinde olursanız , bu durumlarda oyuncu kadrosu da bir istisna oluşturacaktır.)
Doubletip numarası 10000000000.6(on milyar nokta altı) "gerçek" bir sayıdır. Bunun intüzerine bir cast kullanmak garip bir sonuç verecektir ( checkedbağ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)scoreondalı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