Mengapa Decimal.Divide (int, int) berfungsi, tetapi tidak (int / int)?

106

Kenapa membagi dua angka int 32 bit karena (int / int) kembali kepada saya 0, tetapi jika saya menggunakan Decimal.Divide()saya mendapatkan jawaban yang benar? Aku sama sekali bukan cowok #

Liam
sumber
1
Bisakah Anda memberikan contoh spesifik? Desimal adalah jenis yang berbeda dari Int32.
Groo
Ngomong-ngomong, saya menemukan Desimal. Bagi hanya membutuhkan desimal sebagai masukan.
Ravi
Decimal.Divide juga berfungsi untuk integer sebagai input.
Thamarai T

Jawaban:

215

intadalah tipe integer; membagi dua int melakukan pembagian integer , yaitu bagian pecahan dipotong karena tidak dapat disimpan dalam tipe hasil (juga int!). Decimal, sebaliknya, memiliki bagian pecahan. Dengan memanggil Decimal.Divide, intargumen Anda secara implisit diubah menjadi Decimals.

Anda dapat menerapkan pembagian non-integer pada intargumen dengan secara eksplisit mentransmisikan setidaknya satu argumen ke tipe floating-point, misalnya:

int a = 42;
int b = 23;
double result = (double)a / b;
Konrad Rudolph
sumber
2
Jawaban bagus. Saya juga mencoba Decimal.Divide (a, b) yang memberikan hasil yang sama.
Baxter
6

Dalam kasus pertama, Anda melakukan pembagian bilangan bulat, sehingga hasilnya terpotong (bagian desimal dipotong) dan bilangan bulat dikembalikan.

Dalam kasus kedua, int diubah menjadi desimal terlebih dahulu, dan hasilnya adalah desimal. Karenanya mereka tidak terpotong dan Anda mendapatkan hasil yang benar.

Andrew Rollings
sumber
4

Baris berikut:

int a = 1, b = 2;
object result = a / b;

... akan dilakukan dengan menggunakan aritmatika integer . Decimal.Dividedi sisi lain mengambil dua parameter tipe Decimal, sehingga pembagian akan dilakukan pada nilai desimal daripada nilai integer. Itu setara dengan ini:

int a = 1, b = 2;
object result = (Decimal)a / (Decimal)b;

Untuk memeriksanya, Anda dapat menambahkan baris kode berikut setelah masing-masing contoh di atas:

Console.WriteLine(result.ToString());
Console.WriteLine(result.GetType().ToString());

Output dalam kasus pertama adalah

0
System.Int32

..dan dalam kasus kedua:

0,5
System.Decimal
Fredrik Mörk
sumber
2

Saya rasa Decimal.Divide(decimal, decimal)secara implisit mengubah 2 argumen intnya menjadi desimal sebelum mengembalikan nilai desimal (tepat) dimana 4/5 diperlakukan sebagai pembagian integer dan mengembalikan 0

Gishu
sumber
1

Anda ingin memasukkan angka:

ganda c = (ganda) a / (ganda) b;

Catatan: Jika salah satu argumen di C # adalah ganda, pembagian ganda digunakan yang menghasilkan ganda. Jadi, berikut ini juga akan berhasil:

ganda c = (ganda) a / b;

berikut adalah Program Kecil:

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();
        }
Jaydeep Shil
sumber
0

Jika Anda mencari 0 <a <1 jawaban, int / int tidak akan cukup. int / int melakukan pembagian integer. Cobalah mentransmisikan salah satu int menjadi ganda di dalam operasi.

Brian
sumber
1
Int32 adalah bilangan bulat bertanda, maksud Anda 0 <jawaban <1?
Groo
0

Dalam kasus saya tidak ada yang berhasil di atas.

yang ingin saya lakukan adalah membagi 278 dengan 575 dan mengalikan dengan 100 untuk menemukan persentase.

double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);

%: 48,3478260869565 -> 278/575 ---> 0%: 51,6521739130435 -> 297/575 ---> 0

jika saya mengalikan PeopleCount dengan 1.0 itu membuatnya menjadi desimal dan pembagian akan menjadi 48.34 ... juga kalikan dengan 100.0 bukan 100.

Alp Altunel
sumber
-1

Jawaban yang ditandai seperti itu hampir selesai, tetapi saya pikir perlu ditambahkan bahwa ada perbedaan antara penggunaan ganda dan desimal.

Saya tidak akan menjelaskan konsepnya dengan lebih baik daripada Wikipedia, jadi saya hanya akan memberikan petunjuknya:

aritmatika floating-point

tipe data desimal

Dalam sistem keuangan, sering kali merupakan persyaratan bahwa kami dapat menjamin akurasi tempat desimal dalam jumlah tertentu (basis 10). Ini umumnya tidak mungkin jika input / data sumber dalam basis 10 tetapi kami melakukan aritmatika dalam basis 2 (karena jumlah tempat desimal yang diperlukan untuk perluasan desimal suatu angka bergantung pada basis; sepertiga membutuhkan banyak desimal yang tak terhingga tempat untuk mengekspresikan dalam basis 10 sebagai 0,333333 ..., tetapi hanya membutuhkan satu desimal dalam basis-3: 0,1).

Angka floating-point lebih cepat untuk digunakan (dalam hal waktu CPU; dari segi pemrograman, angka tersebut sama-sama sederhana) dan lebih disukai kapan pun Anda ingin meminimalkan kesalahan pembulatan (seperti dalam aplikasi ilmiah).

Dojo
sumber
1
Tidak ada dalam tanggapan Anda yang berfungsi untuk menjawab pertanyaan asli
LordWilmore