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 #.
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 #.
Câu trả lời:
int
là 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ư int
vậ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 Decimal
s.
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;
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.
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.Divide
mặ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
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();
}
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.
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 ý:
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).