การแปลงคู่เป็นจำนวนเต็มใน java


114

ใน Java ฉันต้องการแปลงคู่เป็นจำนวนเต็มฉันรู้ว่าคุณทำสิ่งนี้:

double x = 1.5;
int y = (int)x;

คุณจะได้รับ y = 1 หากคุณทำสิ่งนี้:

int y = (int)Math.round(x);

คุณน่าจะได้ 2 อย่างไรก็ตามฉันสงสัยว่า: เนื่องจากบางครั้งการแทนค่าจำนวนเต็มสองครั้งดูเหมือน 1.9999999998 หรือบางอย่างมีความเป็นไปได้หรือไม่ที่การคัดเลือกคู่ที่สร้างขึ้นผ่านทาง Math.round () จะยังคงส่งผลให้ตัวเลขที่ถูกตัดทอนลง กว่าจำนวนปัดเศษที่เรากำลังมองหา (เช่น: 1 แทนที่จะเป็น 2 ในรหัสที่แสดง)?

(และใช่ฉันไม่ได้หมายความว่ามันเป็นเช่นนี้: มีใด ๆค่าสำหรับ X, Y ที่จะแสดงผลที่เป็นมากกว่าการตัดทอนเป็นตัวแทนโค้งมนของ x หรือไม่?)

ถ้าเป็นเช่นนั้น: มีวิธีที่ดีกว่าในการเพิ่มค่า int สองเท่าโดยไม่เสี่ยงต่อการตัดทอนหรือไม่?


คิดอะไรบางอย่าง: Math.round (x) ส่งคืน long ไม่ใช่สองเท่า ดังนั้น: เป็นไปไม่ได้ที่ Math.round () จะส่งคืนตัวเลขที่มีลักษณะเหมือน 3.9999998 ดังนั้น int (Math.round ()) ไม่จำเป็นต้องตัดทอนอะไรเลยและจะใช้งานได้เสมอ


6
Math.round (double) ส่งคืน long ไม่ใช่ double
qbert220

คำตอบ:


95

มีความเป็นไปได้หรือไม่ที่การร่ายคู่ที่สร้างขึ้นMath.round()จะยังคงส่งผลให้ตัวเลขถูกตัดทอนลง

ไม่round()จะปัดเศษคู่ของคุณเป็นค่าที่ถูกต้องเสมอจากนั้นจะถูกโยนไปที่longซึ่งจะตัดทศนิยมใด ๆ แต่หลังจากปัดเศษแล้วจะไม่มีส่วนที่เป็นเศษส่วนเหลืออยู่

นี่คือเอกสารจากMath.round(double):

ส่งคืนค่าความยาวที่ใกล้เคียงที่สุดกับอาร์กิวเมนต์ ผลลัพธ์จะถูกปัดเศษให้เป็นจำนวนเต็มโดยการเพิ่ม 1/2 นำพื้นของผลลัพธ์และการส่งผลลัพธ์เพื่อพิมพ์แบบยาว กล่าวอีกนัยหนึ่งผลลัพธ์จะเท่ากับค่าของนิพจน์:

(long)Math.floor(a + 0.5d)

3
จุดสำคัญคือการปัดเศษจะทำภายในวิธีการปัดเศษ ค่า long จะถูกส่งกลับซึ่งสามารถส่งไปยัง int ได้อย่างปลอดภัย (สมมติว่าค่าที่ส่งคืนจะอยู่ในช่วง int เสมอ)
qbert220

ใช่. นึกไม่ออกว่า a / long / to int ให้ปัญหา เห็นได้ชัด! น่าจะคิดได้ :(
vdMandele

1
แม้ว่าจะเป็นความจริงที่การตัดทอนจะไม่เกิดขึ้นเนื่องจากการปัดเศษ แต่คุณอาจยังไม่ได้ผลลัพธ์ที่คาดหวังเพียงเนื่องจากการหล่อจาก double ซึ่งเป็นตัวเลขที่มาก[max double: 1.7976931348623157E308]ไปจนถึง int ซึ่งมีขนาดเล็กกว่า[max int: 2147483647]มาก สิ่งที่ควรทราบ
Nelda.techspiress

22

สำหรับประเภทข้อมูลDoubleถึงintคุณสามารถใช้สิ่งต่อไปนี้:

Double double = 5.00;

int integer = double.intValue();

เขากำลังมองหามูลค่าที่กลม
Marquis of Lorne

1
ฉันไม่คิดว่าจะให้สิ่งที่คุณคาดหวังสำหรับ 4.99999999999 (จะให้ 4 ไม่ใช่ 5)
murkle

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