เหตุใด Decimal.Divide (int, int) จึงทำงาน แต่ไม่ทำงาน (int / int)


107

ทำไมการหารตัวเลข int 32 บิตสองตัวเป็น (int / int) จะส่งกลับมาให้ฉัน0แต่ถ้าฉันใช้Decimal.Divide()ฉันจะได้คำตอบที่ถูกต้อง ฉันไม่ได้หมายความว่าผู้ชาย #


1
คุณสามารถระบุตัวอย่างได้หรือไม่? ทศนิยมเป็นประเภทที่แตกต่างจาก Int32
Groo

โดยวิธีการที่ฉันพบทศนิยมการหารใช้ทศนิยมเป็นอินพุตเท่านั้น
ราวี

ทศนิยมการหารใช้กับจำนวนเต็มเป็นอินพุตได้เช่นกัน
Thamarai T

คำตอบ:


219

intเป็นประเภทจำนวนเต็ม การหารสอง int จะเป็นการหารจำนวนเต็มกล่าวคือส่วนที่เป็นเศษส่วนจะถูกตัดทอนเนื่องจากไม่สามารถเก็บไว้ในประเภทผลลัพธ์ได้ (เช่นกันint!) Decimalตรงกันข้ามมีส่วนที่เป็นเศษส่วน โดยการเรียกใช้อาร์กิวเมนต์Decimal.Divideของคุณintจะถูกแปลงเป็นDecimals โดยปริยาย

คุณสามารถบังคับใช้การหารที่ไม่ใช่จำนวนเต็มกับintอาร์กิวเมนต์ได้โดยการส่งอาร์กิวเมนต์อย่างชัดเจนอย่างน้อยหนึ่งอาร์กิวเมนต์ไปยังประเภททศนิยมเช่น:

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

2
คำตอบที่ดี ฉันลองทศนิยมด้วยหาร (a, b) ซึ่งให้ผลลัพธ์เหมือนกัน
Baxter

6

ในกรณีแรกคุณกำลังทำการหารจำนวนเต็มดังนั้นผลลัพธ์จึงถูกตัดทอน (ส่วนทศนิยมจะถูกตัดออก) และส่งคืนจำนวนเต็ม

ในกรณีที่สอง ints จะถูกแปลงเป็นทศนิยมก่อนและผลลัพธ์จะเป็นทศนิยม ดังนั้นจึงไม่ถูกตัดทอนและคุณจะได้ผลลัพธ์ที่ถูกต้อง


4

บรรทัดต่อไปนี้:

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

2

ฉันคิดว่าDecimal.Divide(decimal, decimal)จะแปลงอาร์กิวเมนต์ 2 int เป็นทศนิยมโดยปริยายก่อนที่จะส่งกลับค่าทศนิยม (แม่นยำ) โดยที่ 4/5 จะถือว่าเป็นการหารจำนวนเต็มและส่งกลับ 0


1

คุณต้องการโยนตัวเลข:

คู่ 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

หากคุณกำลังมองหา 0 <a <1 คำตอบ int / int จะไม่เพียงพอ int / int หารจำนวนเต็ม ลองแคสต์ int ตัวใดตัวหนึ่งเป็นสองเท่าภายในการดำเนินการ


1
Int32 เป็นเลขจำนวนเต็มคุณหมายถึง 0 <answer <1 หรือไม่?
Groo

0

ในกรณีของฉันไม่มีอะไรทำงานข้างต้น

สิ่งที่ฉันอยากทำคือหาร 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


-1

คำตอบที่ทำเครื่องหมายว่าเกือบจะอยู่ที่นั่นแล้ว แต่ฉันคิดว่ามันคุ้มค่าที่จะเพิ่มความแตกต่างระหว่างการใช้เลขคู่และทศนิยม

ฉันจะไม่ทำงานอธิบายแนวคิดได้ดีไปกว่า Wikipedia ดังนั้นฉันจะให้คำแนะนำ:

เลขคณิตลอยตัว

ประเภทข้อมูลทศนิยม

ในระบบการเงินมักมีข้อกำหนดว่าเราสามารถรับประกันความถูกต้องของตำแหน่งทศนิยมจำนวนหนึ่ง (ฐาน -10) ได้ โดยทั่วไปจะเป็นไปไม่ได้หากข้อมูลอินพุต / แหล่งที่มาอยู่ในฐาน -10 แต่เราคำนวณเลขคณิตในฐาน -2 (เนื่องจากจำนวนตำแหน่งทศนิยมที่จำเป็นสำหรับการขยายทศนิยมของตัวเลขขึ้นอยู่กับฐานหนึ่งในสามใช้ทศนิยมจำนวนมากไม่ จำกัด ที่จะแสดงในฐาน -10 เป็น 0.333333 ... แต่ใช้ทศนิยมเพียงหนึ่งเดียวในฐาน -3: 0.1)

ตัวเลขทศนิยมนั้นทำงานได้เร็วกว่า (ในแง่ของเวลาของ CPU การเขียนโปรแกรมที่ชาญฉลาดนั้นง่ายพอ ๆ กัน) และเป็นที่ต้องการเมื่อใดก็ตามที่คุณต้องการลดข้อผิดพลาดในการปัดเศษ (เช่นเดียวกับในแอปพลิเคชันทางวิทยาศาสตร์)


1
ไม่มีสิ่งใดในคำตอบของคุณที่จะตอบคำถามเดิมได้
LordWilmore
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.