Tại sao Decimal.Divide (int, int) hoạt động, nhưng không hoạt động (int / int)?


105

Tại sao phép chia hai số int 32 bit dưới dạng (int / int) trả về cho tôi 0, nhưng nếu tôi sử dụng, Decimal.Divide()tôi nhận được câu trả lời chính xác? Tôi không có nghĩa là anh chàng ac #.


1
Bạn có thể cung cấp một ví dụ cụ thể? Hệ thập phân là một kiểu khác với Int32.
Groo

Bằng cách tôi tìm thấy Decimal.Divide chỉ lấy số thập phân làm đầu vào.
Ravi

Decimal.Divide cũng hoạt động với các số nguyên làm đầu vào.
Thamarai T

Câu trả lời:


214

intlà một kiểu số nguyên; chia hai int thực hiện phép chia số nguyên , tức là phần phân số bị cắt bớt vì nó không thể được lưu trữ trong kiểu kết quả (cũng như intvậy!). Decimal, ngược lại, có một phần phân số. Bằng cách gọi Decimal.Divide, các intđối số của bạn được chuyển đổi hoàn toàn thành Decimals.

Bạn có thể thực thi phép chia không phải số nguyên trên các intđối số bằng cách truyền rõ ràng ít nhất một trong các đối số sang kiểu dấu phẩy động, ví dụ:

int a = 42;
int b = 23;
double result = (double)a / b;

2
Câu trả lời rất hay. Tôi cũng đã thử Decimal.Divide (a, b) cho kết quả tương tự.
Baxter

6

Trong trường hợp đầu tiên, bạn đang thực hiện phép chia số nguyên, vì vậy kết quả sẽ bị cắt bớt (phần thập phân bị cắt bớt) và một số nguyên được trả về.

Trong trường hợp thứ hai, đầu tiên các số nguyên được chuyển đổi thành số thập phân và kết quả là số thập phân. Do đó chúng không bị cắt bớt và bạn sẽ có kết quả chính xác.


4

Dòng sau:

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

... sẽ được thực hiện bằng cách sử dụng số học nguyên . Decimal.Dividemặt khác nhận hai tham số của kiểu Decimal, vì vậy phép chia sẽ được thực hiện trên các giá trị thập phân hơn là các giá trị nguyên. Điều đó tương đương với điều này:

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

Để kiểm tra điều này, bạn có thể thêm các dòng mã sau sau mỗi ví dụ trên:

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

Đầu ra trong trường hợp đầu tiên sẽ là

0
System.Int32

..và trong trường hợp thứ hai:

0,5
System.Decimal

2

Tôi nghĩ rằng Decimal.Divide(decimal, decimal)chuyển đổi ngầm 2 đối số int của nó thành số thập phân trước khi trả về giá trị thập phân (chính xác) trong đó 4/5 được coi là phép chia số nguyên và trả về 0


1

Bạn muốn truyền các số:

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

Lưu ý: Nếu bất kỳ đối số nào trong C # là một đối số kép, thì phép chia đôi được sử dụng để tạo ra một đối số kép. Vì vậy, những điều sau đây cũng sẽ hoạt động:

double c = (double) a / b;

đây là một chương trình nhỏ:

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

Nếu bạn đang tìm câu trả lời 0 <a <1, int / int sẽ không đủ. int / int thực hiện phép chia số nguyên. Thử truyền một trong các int thành nhân đôi bên trong hoạt động.


1
Int32 là một số nguyên có dấu, ý bạn là 0 <answer <1?
Groo

0

Trong trường hợp của tôi, không có gì hoạt động ở trên.

những gì tôi muốn làm là chia 278 cho 575 và nhân với 100 để tìm phần trăm.

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

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

nếu tôi nhân PeopleCount với 1,0, nó làm cho nó thành số thập phân và phép chia sẽ là 48,34 ... cũng nhân với 100,0 chứ không phải 100.


-1

Câu trả lời được đánh dấu như vậy là rất gần ở đó, nhưng tôi nghĩ rằng điều đáng nói là có sự khác biệt giữa việc sử dụng kép và thập phân.

Tôi sẽ không làm công việc giải thích các khái niệm tốt hơn Wikipedia, vì vậy tôi sẽ chỉ cung cấp các gợi ý:

số học dấu phẩy động

kiểu dữ liệu thập phân

Trong các hệ thống tài chính, chúng tôi thường có yêu cầu đảm bảo độ chính xác của một số chữ số thập phân (cơ số 10) nhất định. Điều này nói chung là không thể nếu dữ liệu đầu vào / nguồn ở cơ số 10 nhưng chúng tôi thực hiện số học trong cơ số 2 (vì số chữ số thập phân cần thiết để mở rộng thập phân của một số phụ thuộc vào cơ số; một phần ba lấy vô hạn số thập phân vị trí cần biểu thị trong cơ số 10 là 0,333333 ..., nhưng nó chỉ cần một số thập phân trong cơ số 3: 0,1).

Số dấu phẩy động hoạt động nhanh hơn (về thời gian CPU; về mặt lập trình, chúng đơn giản như nhau) và được ưa thích bất cứ khi nào bạn muốn giảm thiểu lỗi làm tròn (như trong các ứng dụng khoa học).


1
Không có gì trong phản ứng của bạn phục vụ để trả lời câu hỏi ban đầu
LordWilmore
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.