Decimal.Divide (int, int) neden çalışıyor, ancak (int / int) neden çalışmıyor?


107

(İ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.


1
Spesifik bir örnek verebilir misiniz? Ondalık, Int32'den farklı bir türdür.
Groo

Bu arada, Decimal.Divide'ı girdi olarak yalnızca ondalık sayıları aldığını buldum .
Ravi

Ondalık Bölme, girdi olarak tamsayılar için de çalışır.
Thamarai T

Yanıtlar:


217

intbir 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 . Decimalaksine, kesirli bir kısmı vardır. Çağırarak Decimal.Divide, intargümanlarınız örtük olarak Decimals'ye dönüştürülür .

intBağı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;

2
Güzel cevap. Aynı sonucu veren Decimal.Divide (a, b) 'yi de denedim.
Baxter

6

İ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.


4

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

2

Sanırım Decimal.Divide(decimal, decimal)2 int bağımsız değişkenlerini ondalık bir değer (kesin) döndürmeden önce örtük olarak ondalık sayılara dönüştürür, burada 4/5 tamsayı bölümü olarak değerlendirilir ve 0 döndürür


1

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();
        }

0

0 <a <1 yanıt arıyorsanız, int / int yeterli olmayacaktır. int / int tamsayı bölme yapar. İşlemin içinde int'lerden birini ikiye katlamayı deneyin.


1
Int32 işaretli bir tam sayıdır, demek istediniz 0 <yanıt <1?
Groo

0

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.


-1

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:

kayan nokta aritmetiği

ondalık veri türü

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.


1
Cevabınızdaki hiçbir şey asıl soruyu cevaplamaya
yaramıyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.