ทำไมการหารตัวเลข int 32 บิตสองตัวเป็น (int / int) จะส่งกลับมาให้ฉัน0
แต่ถ้าฉันใช้Decimal.Divide()
ฉันจะได้คำตอบที่ถูกต้อง ฉันไม่ได้หมายความว่าผู้ชาย #
ทำไมการหารตัวเลข int 32 บิตสองตัวเป็น (int / int) จะส่งกลับมาให้ฉัน0
แต่ถ้าฉันใช้Decimal.Divide()
ฉันจะได้คำตอบที่ถูกต้อง ฉันไม่ได้หมายความว่าผู้ชาย #
คำตอบ:
int
เป็นประเภทจำนวนเต็ม การหารสอง int จะเป็นการหารจำนวนเต็มกล่าวคือส่วนที่เป็นเศษส่วนจะถูกตัดทอนเนื่องจากไม่สามารถเก็บไว้ในประเภทผลลัพธ์ได้ (เช่นกันint
!) Decimal
ตรงกันข้ามมีส่วนที่เป็นเศษส่วน โดยการเรียกใช้อาร์กิวเมนต์Decimal.Divide
ของคุณint
จะถูกแปลงเป็นDecimal
s โดยปริยาย
คุณสามารถบังคับใช้การหารที่ไม่ใช่จำนวนเต็มกับint
อาร์กิวเมนต์ได้โดยการส่งอาร์กิวเมนต์อย่างชัดเจนอย่างน้อยหนึ่งอาร์กิวเมนต์ไปยังประเภททศนิยมเช่น:
int a = 42;
int b = 23;
double result = (double)a / b;
ในกรณีแรกคุณกำลังทำการหารจำนวนเต็มดังนั้นผลลัพธ์จึงถูกตัดทอน (ส่วนทศนิยมจะถูกตัดออก) และส่งคืนจำนวนเต็ม
ในกรณีที่สอง ints จะถูกแปลงเป็นทศนิยมก่อนและผลลัพธ์จะเป็นทศนิยม ดังนั้นจึงไม่ถูกตัดทอนและคุณจะได้ผลลัพธ์ที่ถูกต้อง
บรรทัดต่อไปนี้:
int a = 1, b = 2;
object result = a / b;
... จะได้รับการดำเนินการโดยใช้คณิตศาสตร์จำนวนเต็ม Decimal.Divide
ในทางกลับกันใช้สองพารามิเตอร์ของประเภทDecimal
ดังนั้นการหารจะดำเนินการกับค่าทศนิยมแทนที่จะเป็นค่าจำนวนเต็ม ซึ่งเทียบเท่ากับสิ่งนี้:
int a = 1, b = 2;
object result = (Decimal)a / (Decimal)b;
ในการตรวจสอบสิ่งนี้คุณสามารถเพิ่มบรรทัดรหัสต่อไปนี้หลังจากแต่ละตัวอย่างข้างต้น:
Console.WriteLine(result.ToString());
Console.WriteLine(result.GetType().ToString());
ผลลัพธ์ในกรณีแรกจะเป็น
0
System.Int32
.. และในกรณีที่สอง:
0,5
System.Decimal
ฉันคิดว่าDecimal.Divide(decimal, decimal)
จะแปลงอาร์กิวเมนต์ 2 int เป็นทศนิยมโดยปริยายก่อนที่จะส่งกลับค่าทศนิยม (แม่นยำ) โดยที่ 4/5 จะถือว่าเป็นการหารจำนวนเต็มและส่งกลับ 0
คุณต้องการโยนตัวเลข:
คู่ c = (คู่) a / (คู่) b;
หมายเหตุ: หากอาร์กิวเมนต์ใด ๆ ใน C # เป็นคู่จะใช้การหารสองครั้งซึ่งจะให้ผลลัพธ์เป็นสองเท่า ดังนั้นสิ่งต่อไปนี้ก็ใช้ได้เช่นกัน:
คู่ c = (คู่) a / b;
นี่คือโปรแกรมขนาดเล็ก:
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 <a <1 คำตอบ int / int จะไม่เพียงพอ int / int หารจำนวนเต็ม ลองแคสต์ int ตัวใดตัวหนึ่งเป็นสองเท่าภายในการดำเนินการ
ในกรณีของฉันไม่มีอะไรทำงานข้างต้น
สิ่งที่ฉันอยากทำคือหาร 278 ด้วย 575 แล้วคูณด้วย 100 เพื่อหาเปอร์เซ็นต์
double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);
%: 48,3478260869565 -> 278/575 ---> 0%: 51,6521739130435 -> 297/575 ---> 0
ถ้าฉันคูณ PeopleCount ด้วย 1.0 มันทำให้เป็นทศนิยมและการหารจะเป็น 48.34 ... คูณด้วย 100.0 ไม่ใช่ 100
คำตอบที่ทำเครื่องหมายว่าเกือบจะอยู่ที่นั่นแล้ว แต่ฉันคิดว่ามันคุ้มค่าที่จะเพิ่มความแตกต่างระหว่างการใช้เลขคู่และทศนิยม
ฉันจะไม่ทำงานอธิบายแนวคิดได้ดีไปกว่า Wikipedia ดังนั้นฉันจะให้คำแนะนำ:
ในระบบการเงินมักมีข้อกำหนดว่าเราสามารถรับประกันความถูกต้องของตำแหน่งทศนิยมจำนวนหนึ่ง (ฐาน -10) ได้ โดยทั่วไปจะเป็นไปไม่ได้หากข้อมูลอินพุต / แหล่งที่มาอยู่ในฐาน -10 แต่เราคำนวณเลขคณิตในฐาน -2 (เนื่องจากจำนวนตำแหน่งทศนิยมที่จำเป็นสำหรับการขยายทศนิยมของตัวเลขขึ้นอยู่กับฐานหนึ่งในสามใช้ทศนิยมจำนวนมากไม่ จำกัด ที่จะแสดงในฐาน -10 เป็น 0.333333 ... แต่ใช้ทศนิยมเพียงหนึ่งเดียวในฐาน -3: 0.1)
ตัวเลขทศนิยมนั้นทำงานได้เร็วกว่า (ในแง่ของเวลาของ CPU การเขียนโปรแกรมที่ชาญฉลาดนั้นง่ายพอ ๆ กัน) และเป็นที่ต้องการเมื่อใดก็ตามที่คุณต้องการลดข้อผิดพลาดในการปัดเศษ (เช่นเดียวกับในแอปพลิเคชันทางวิทยาศาสตร์)