ฉันจะแบ่งจำนวนเต็มสองตัวเพื่อให้ได้ค่าเป็นสองเท่าได้อย่างไร


282

ฉันจะแบ่งจำนวนเต็มสองตัวเป็นสองเท่าได้อย่างไร


10
สมมติว่าสิ่งนี้ถูกถามในการสัมภาษณ์ - การหารจำนวนเต็มจะให้ผลลัพธ์เป็นจำนวนเต็มเสมอ คุณต้องใช้การส่งแบบเดียวกับที่แสดงด้านล่าง
Sesh

2
หน่วยงานประเภทต่าง ๆ : จำนวนเต็มจำนวนจุดลอยตัวทศนิยมได้อธิบายไว้ในเหตุใดการหารจำนวนเต็มใน c # จึงส่งกลับจำนวนเต็ม แต่ไม่ใช่
Michael Freidgeim

คำตอบ:


460

คุณต้องการที่จะส่งตัวเลข:

double num3 = (double)num1/(double)num2;

หมายเหตุ: ถ้าใด ๆ ของการขัดแย้งใน C # เป็นdoubleที่หารถูกนำมาใช้ซึ่งจะส่งผลให้double doubleดังนั้นสิ่งต่อไปนี้ก็ใช้ได้เช่นกัน:

double num3 = (double)num1/num2;

สำหรับข้อมูลเพิ่มเติมดู:

Dot Net Perls


3
ไม่ทราบว่านี่เหมือนกันใน C # หรือไม่ แต่ C กำหนดให้คุณส่งเฉพาะคนแรกเท่านั้น - มันจะสร้าง double / int เป็น double โดยอัตโนมัติ
paxdiablo

4
@Pax หาก args ใด ๆ ใน C หรือ C # เป็น double จะใช้การหารสองครั้ง (ส่งผลให้เป็น double)
strager

32
double num3 = (double)(num1/num2);ระมัดระวังไม่ให้ทำเช่นนี้: - นี่จะทำให้คุณได้ผลลัพธ์เป็นสองเท่าของการหารจำนวนเต็ม!
Coder Lonely

หากว่าคุณไม่ต้องการความแม่นยำเป็นพิเศษมีเหตุผลอะไรที่จะส่งไปให้doubleแทนที่จะfloat? ฉันเห็นคำถามที่เรียกร้องdoubleแต่ฉันก็ยังสงสัยอยู่
Kyle Delaney

@KyleDelaney เพียงสาเหตุใน C # เราปกติใช้และไม่ได้double floatเมื่อคุณเขียนตัวแปรเช่นเดียวvar a = 1.0;นี้ 1.0 doubleอยู่เสมอ ฉันคิดว่านี่เป็นเหตุผลหลัก
this.myself

31

การเติมเต็มคำตอบของ @ NoahD

เพื่อให้มีความแม่นยำมากขึ้นคุณสามารถแปลงเป็นทศนิยม:

(decimal)100/863
//0.1158748551564310544611819235

หรือ:

Decimal.Divide(100, 863)
//0.1158748551564310544611819235

สองครั้งจะแทนการจัดสรร 64 บิตในขณะที่ทศนิยมใช้ 128

(double)100/863
//0.11587485515643106

คำอธิบายเชิงลึกของ "ความแม่นยำ"

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการแสดงจุดที่ลอยอยู่ในไบนารีและความแม่นยำของมันจะดูที่บทความนี้จากจอนสกีตที่เขาพูดเกี่ยวกับfloatsและdoublesและคนนี้decimalsที่เขาพูดเกี่ยวกับ


2
ไม่ถูกต้อง! doubleมีความแม่นยำ 53 บิตและมันเป็นไบนารีรูปแบบจุดลอยตัวในขณะที่decimalเป็น ... ทศนิยมหนึ่งของหลักสูตรที่มี96 บิตของความแม่นยำ ดังนั้นdoubleแม่นยำถึง ~ 15-17 หลักและ 28-29 หลักทศนิยม (ไม่ใช่ความแม่นยำสองเท่าของdouble) ที่สำคัญกว่าdecimalนั้นใช้ 102 บิตจาก 128 บิตเท่านั้น
phuclv

ขอบคุณ @phuclv แก้ไขได้แล้ว ฉันหมายถึง "การจัดสรรพื้นที่" คุณพูดถูกต้องเกี่ยวกับความแม่นยำของdecimals(96) แต่doublesมี52 บิตของ mantissaไม่ใช่ 53
fabriciorissetto

1
ใช่แมนทิสซามี 52 บิต แต่ก็ยังมีบิตที่ซ่อนอยู่ส่งผลให้ซิกนิฟิแคนด์ 53 บิต ความแม่นยำจุดลอยตัว 52 หรือ 53 บิตใช่หรือไม่?
phuclv

Decimal.Divide ยอดเยี่ยมมาก! ขอบคุณ
Ricardo G Saraiva


5

แปลงหนึ่งในนั้นเป็นสองเท่าก่อน แบบฟอร์มนี้ใช้งานได้หลายภาษา:

 real_result = (int_numerator + 0.0) / int_denominator

1
ง่ายกว่าที่จะทำ ...var result = 1.0 * a / b;
พื้นฐาน

@ ขั้นพื้นฐานมี 100 วิธีในการทำ ฉันชอบการเพิ่มเพราะมันเร็วกว่าถึงแม้ว่าการหล่อจะเร็วขึ้นอย่างเห็นได้ชัด
Mark Ransom

1
var firstNumber=5000,
secondeNumber=37;

var decimalResult = decimal.Divide(firstNumber,secondeNumber);

Console.WriteLine(decimalResult );

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