(İnt / int) döndüğünde iki 32 bit int sayısının bölünmesi nasıl olur 0
, ama kullanırsam Decimal.Divide()
doğru cevabı alırım? Ben kesinlikle ac # adam değilim.
(İnt / int) döndüğünde iki 32 bit int sayısının bölünmesi nasıl olur 0
, ama kullanırsam Decimal.Divide()
doğru cevabı alırım? Ben kesinlikle ac # adam değilim.
Yanıtlar:
int
bir tamsayı türüdür; iki girişi bölmek bir tamsayı bölme gerçekleştirir , yani kesirli kısım sonuç türünde (ayrıca int
!) saklanamadığından kesilir . Decimal
aksine, kesirli bir kısmı vardır. Çağırarak Decimal.Divide
, int
argümanlarınız örtük olarak Decimal
s'ye dönüştürülür .
int
Bağımsız değişkenlerden en az birini bir kayan nokta türüne açıkça çevirerek, tamsayı olmayan bölmeyi zorunlu kılabilirsiniz , örneğin:
int a = 42;
int b = 23;
double result = (double)a / b;
İlk durumda, tamsayı bölme yaparsınız, bu nedenle sonuç kesilir (ondalık kısım kesilir) ve bir tamsayı döndürülür.
İkinci durumda, ints önce ondalık sayıya dönüştürülür ve sonuç bir ondalıktır. Bu nedenle kesilmezler ve doğru sonucu alırsınız.
Aşağıdaki satır:
int a = 1, b = 2;
object result = a / b;
... tamsayı aritmetiği kullanılarak yapılacaktır . Decimal.Divide
Öte yandan türden iki parametre alır Decimal
, bu nedenle bölme tamsayı değerleri yerine ondalık değerler üzerinde gerçekleştirilir. Bu şuna eşdeğerdir:
int a = 1, b = 2;
object result = (Decimal)a / (Decimal)b;
Bunu incelemek için, yukarıdaki örneklerin her birinin arkasına aşağıdaki kod satırlarını ekleyebilirsiniz:
Console.WriteLine(result.ToString());
Console.WriteLine(result.GetType().ToString());
İlk durumda çıktı
0
System.Int32
..ve ikinci durumda:
0,5
System.Decimal
Rakamları atmak istiyorsunuz:
çift c = (çift) a / (çift) b;
Not: C #'daki argümanlardan herhangi biri bir double ise, bir double ile sonuçlanan bir çift bölme kullanılır. Dolayısıyla, aşağıdakiler de işe yarar:
çift c = (çift) a / b;
İşte Küçük bir Program:
static void Main(string[] args)
{
int a=0, b = 0, c = 0;
int n = Convert.ToInt16(Console.ReadLine());
string[] arr_temp = Console.ReadLine().Split(' ');
int[] arr = Array.ConvertAll(arr_temp, Int32.Parse);
foreach (int i in arr)
{
if (i > 0) a++;
else if (i < 0) b++;
else c++;
}
Console.WriteLine("{0}", (double)a / n);
Console.WriteLine("{0}", (double)b / n);
Console.WriteLine("{0}", (double)c / n);
Console.ReadKey();
}
Benim durumumda yukarıda hiçbir şey işe yaramadı.
Yapmak istediğim, 278'i 575'e bölmek ve yüzdeyi bulmak için 100 ile çarpmak.
double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);
%: 48,3478260869565 -> 278/575 ->% 0: 51,6521739130435 -> 297/575 -> 0
PeopleCount'u 1.0 ile çarparsam, ondalık yapar ve bölme 48.34 olur ... ayrıca 100.0 değil 100.0 ile çarpılır.
Bu şekilde işaretlenen cevap neredeyse orada, ancak çift ve ondalık kullanım arasında bir fark olduğunu eklemeye değer olduğunu düşünüyorum.
Kavramları açıklamak için Wikipedia'dan daha iyi bir iş yapmazdım, bu yüzden sadece ipuçları vereceğim:
Finansal sistemlerde, belirli sayıda (10 tabanında) ondalık basamak doğruluğunu garanti edebilmemiz genellikle bir gerekliliktir. Giriş / kaynak verileri taban-10 ise bu genellikle imkansızdır, ancak aritmetiği taban-2'de gerçekleştiririz (çünkü bir sayının ondalık genişletmesi için gereken ondalık basamak sayısı tabana bağlıdır; üçte biri sonsuz sayıda ondalık alır basamak-10'da 0.333333 ... olarak ifade edilir, ancak taban-3: 0.1'de yalnızca bir ondalık yer alır).
Kayan noktalı sayılarla çalışmak daha hızlıdır (CPU süresi açısından; programlama açısından eşit derecede basittir) ve yuvarlama hatasını en aza indirmek istediğinizde (bilimsel uygulamalarda olduğu gibi) tercih edilir.