วิธีแปลง float เป็น int ด้วย Java


342

ฉันใช้บรรทัดต่อไปนี้เพื่อแปลง float เป็น int แต่ไม่แม่นยำเท่าที่ฉันต้องการ:

 float a=8.61f;
 int b;

 b=(int)a;

ผลลัพธ์คือ: 8(ควรเป็น9)

เมื่อa = -7.65fใดผลลัพธ์คือ: -7(ควรเป็น-8)

วิธีที่ดีที่สุดที่จะทำคืออะไร?


16
ฉันควรชี้ให้เห็นว่าเพียงพิมพ์ตัวอักษรที่ตัดทอนค่าและไม่ดำเนินการปัดเศษ / การปูพื้นบนค่า
Brian Graham

คำตอบ:


678

การใช้Math.round()จะปัดเศษทศนิยมเป็นจำนวนเต็มที่ใกล้ที่สุด


1
ทำไมต้องใช้ typecast หลังจาก Math.round ()
หมอผี

81
Math.round()ส่งคืนintค่าดังนั้นการใช้ typecasting (int)จึงซ้ำซ้อน
Solvek

5
ใช้ / หรือ ... (int)fooง่ายกว่า
yuttadhammo

31
คำตอบของ Solvek นั้นถูกต้อง แต่ฉันต้องการชี้ให้เห็นว่า Math.round () สามารถมีเอาต์พุตสองชนิดที่แตกต่างกันตามอินพุต Math.round (double a) ส่งคืนความยาว Math.round (float a) คืนค่า int docs.oracle.com/javase/7/docs/api/java/lang/…
Hososugi

2
Math.round () เป็นการทำงานที่ช้าเมื่อเทียบกับการส่งไปยัง (int)
darkgaze

186

ที่จริงแล้วมีวิธีต่าง ๆ ในการ downcast float เป็น int ขึ้นอยู่กับผลลัพธ์ที่คุณต้องการบรรลุ: (สำหรับ int i, float f)

  • round (จำนวนเต็มที่ใกล้เคียงที่สุดกับ float ที่ให้มา)

    i = Math.round(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -3

    หมายเหตุ: นี่คือตามสัญญาเท่ากับ (int) Math.floor(f + 0.5f)

  • ตัด (เช่นวางทุกอย่างหลังจากจุดทศนิยม)

    i = (int) f;
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
  • ceil / floor (จำนวนเต็มใหญ่กว่า / เล็กกว่าค่าที่กำหนดเสมอหากมีส่วนที่เป็นเศษส่วน)

    i = (int) Math.ceil(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  3 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
    
    i = (int) Math.floor(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -3 ; f = -2.68 -> i = -3

สำหรับการปัดเศษค่าบวกคุณสามารถใช้(int)(f + 0.5)ซึ่งทำงานเหมือนกับMath.Roundในกรณีเหล่านั้น (ตามเอกสาร)

คุณสามารถใช้Math.rint(f)ในการปัดเศษเป็นจำนวนเต็มคู่ที่ใกล้เคียงที่สุด ; มันมีประโยชน์ถ้าคุณคาดว่าจะจัดการกับจำนวนมากที่มีส่วนที่เป็นเศษส่วนอย่างเคร่งครัดเท่ากับ 0.5 (บันทึกปัญหาการปัดเศษ IEEE ที่เป็นไปได้) และต้องการให้ค่าเฉลี่ยของชุดอยู่ในสถานที่; คุณจะแนะนำอคติอื่นโดยที่ตัวเลขแม้จะเป็นเรื่องธรรมดามากกว่าคี่

ดู

http://mindprod.com/jgloss/round.html

http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html

สำหรับข้อมูลเพิ่มเติมและตัวอย่างบางส่วน


rint เป็นการปัดเศษของนายธนาคาร ช่วยลดข้อผิดพลาดที่อาจปรากฏขึ้นหากคุณปัดขึ้นหรือลง 0.5 รอบอย่างสม่ำเสมอ
prosfilaes

@prosfilaes ฉันได้เปลี่ยนคำ & เพิ่มลิงค์ wiki เป็นส่วนหนึ่งของคำตอบนั้น


6

Math.round ส่งคืนค่าจำนวนเต็มดังนั้นคุณไม่จำเป็นต้องพิมพ์ตัวอักษร

int b = Math.round(float a);

14
คำตอบอื่น ๆ พูดแบบนี้แล้ว โปรดเพิ่มคำตอบใหม่เฉพาะเมื่อคุณมีสิ่งใหม่ที่จะเพิ่ม (นอกจากนี้ Math.round จะไม่กลับมาเหมือนเดิม)
Jeffrey Bosboom

1
เขาให้คำอธิบายเกี่ยวกับไม่จำเป็นต้อง typecast (กับคำตอบของ Sachithra) แต่มันอาจถูกแปลงเป็นความคิดเห็น
Ranjith Kumar

5

ใช้Math.round(value)จากนั้นหลังจากพิมพ์ cast เป็นจำนวนเต็ม

float a = 8.61f;
int b = (int)Math.round(a);

Math.round (float) ส่งคืนค่าเป็น int ฉันไม่แน่ใจว่าทำไมจำเป็นต้องส่ง cast ไปยัง int
Nephilim

-1

สำหรับฉันง่ายขึ้น: (int) (a.5.5) // a คือ Float ส่งคืนค่าที่ปัดเศษ

ไม่ขึ้นอยู่กับประเภท Java Math.round ()


4
นี้จะสร้างความสับสนนักพัฒนาจำนวนมากที่วิเคราะห์รหัส มันจะไม่ชัดเจนว่ามันคือการปัดเศษ
ivan.panasiuk

1
แน่นอนมันเป็นแค่คณิตศาสตร์พื้นฐานลอง
Bruno L.

4
"คณิตศาสตร์พื้นฐาน" เป็นคำที่เกี่ยวข้อง :) จากประสบการณ์ของฉันฉันสามารถเดิมพันได้ว่ามากกว่า 50% ของนักพัฒนาจะไม่เข้าใจว่ามันกำลังถูกปัดเศษ มันถูกต้องทางคณิตศาสตร์ แต่อย่างที่ฉันเขียนมันไม่ชัดเจนและมันยากสำหรับคนอื่นที่จะเข้าใจว่ารหัสทำอะไร
ivan.panasiuk

2
-(int) ( PI / 3 )พยายามรหัสของคุณกับลบa... ตั้งแต่เมื่อ-0.5รอบ0?

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