ปัดเศษคู่เพื่อเปลี่ยนเป็น int (java)


120

ตอนนี้ฉันกำลังลองสิ่งนี้:

int a = round(n);

ที่nเป็นdoubleแต่มันไม่ทำงาน ผมทำอะไรผิดหรือเปล่า?


เป็นไปได้ที่จะซ้ำกันของstackoverflow.com/questions/153724/…
Matt Ball

6
คุณควรอธิบายรายละเอียดเพิ่มเติมว่า "ไม่ทำงาน" อย่างละเอียด เกิดอะไรขึ้น? ไม่เกิดอะไรขึ้น? คุณคาดหวังอะไร? คุณมีข้อผิดพลาดอะไร คุณมีround()วิธีการในคลาสเดียวกันหรือไม่? รึimport static java.lang.Math.*เปล่า? ฯลฯ มีหลายวิธีในการปัดเศษตัวเลขและคำตอบที่เป็นไปได้มากมาย กล่าวอีกนัยหนึ่งคำถามของคุณคลุมเครือและคลุมเครือและไม่สามารถตอบได้อย่างสมเหตุสมผลในรูปแบบปัจจุบัน มันถ่ายในที่มืด
BalusC

1
"ไม่ทำงาน" หมายความว่าไม่ปัดเศษเป็น int ที่ใกล้ที่สุดหรือโยนข้อยกเว้นหรือไม่ปัดเศษขึ้น / ลง? คำถามนี้ไม่มีประโยชน์หากไม่ต้องอ้างอิงบริบทกับคำตอบ
modulitos

คำตอบ:


239

ประเภทการส่งคืนของround()เมธอดในข้อมูลโค้ดคืออะไร?

หากเป็นMath.round()วิธีนี้จะส่งกลับค่า Long เมื่อพารามิเตอร์อินพุตเป็น Double

ดังนั้นคุณจะต้องส่งคืนค่า:

int a = (int) Math.round(doubleVar);

1
ลองใช้ Math.toIntExact (long) แทนการแคสต์เป็น int double สามารถเก็บค่าได้หลายช่วงและคุณอาจไม่ต้องการทิ้งบิตที่สำคัญที่สุดออกไปโดยเงียบหากคู่ของคุณมีขนาดใหญ่กว่าที่คุณคาดไว้
othp

ฉันเชื่อว่านักแสดงไม่จำเป็น ฉันไม่ทราบว่ามันเป็นในอดีตหรือไม่ แต่รอบจะส่งกลับค่า int
กลางคัน

@Dropout Math.round ส่งกลับค่า int ถ้าคุณให้มันลอยและ long ถ้าคุณให้มันเป็นสองเท่า
Tur1ng

27

หากคุณไม่ชอบ Math.round () คุณสามารถใช้แนวทางง่ายๆนี้ได้เช่นกัน:

int a = (int) (doubleVar + 0.5);

4
เห็นได้ชัดว่าไม่มีเหตุผลที่มีค่าสำหรับการไม่ชอบMath.round(): stackoverflow.com/a/6468757/1715716
Gauthier Boaglio

3
โซลูชันนี้สั้นกว่าไม่จำเป็นต้องนำเข้าและสามารถพกพาไปยังภาษาโปรแกรมอื่น ๆ ได้โดยมีการเปลี่ยนแปลงน้อยที่สุด และอาจเร็วกว่านั้นขึ้นอยู่กับแพลตฟอร์มของคุณ: stackoverflow.com/questions/12091014/…
Dr. Daniel Thommes

1
ฉันไม่ได้วิจารณ์คำตอบของคุณซึ่งฉันคิดว่ามีประโยชน์มากสำหรับเหตุผลที่คุณพูดถึง โดยความคิดเห็นนี้กล่าวถึงผู้ที่กลัวที่จะใช้งานMath.round()ซึ่ง "แท้จริง" เช่นเดียวกับโซลูชันที่คุณระบุนั่นคือทั้งหมด ไชโย
Gauthier Boaglio

2
ใช่เหมือนที่ nehz พูดฉันเชื่อว่านี่จะปัด -2.1 ถึง -1
Ben Aaronson

5
@AlbertoHormazabal คุณไม่สังเกตเห็นว่าเขาเพิ่ม0.5?
Sasha

11

การปัดเศษสองเท่าเป็นจำนวนเต็ม "ที่ใกล้ที่สุด" ดังนี้:

1.4 -> 1

1.6 -> 2

-2.1 -> -2

-1.3 -> -1

-1.5 -> -2

private int round(double d){
    double dAbs = Math.abs(d);
    int i = (int) dAbs;
    double result = dAbs - (double) i;
    if(result<0.5){
        return d<0 ? -i : i;            
    }else{
        return d<0 ? -(i+1) : i+1;          
    }
}

คุณสามารถเปลี่ยนเงื่อนไข(ผลลัพธ์ <0.5) ได้ตามต้องการ


ฉันเห็นด้วยกับคำตอบของ anivaler แต่ถ้าคุณต้องการปัดเศษเป็นจำนวนเต็มสูงสุดคุณสามารถเลือกด้านล่าง: double decimalNumber = 4.56777; System.out.println (ลอยใหม่ (Math.round (decimalNumber))); Output: 5
Smeet

3
import java.math.*;
public class TestRound11 {
  public static void main(String args[]){
    double d = 3.1537;
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
    // output is 3.15
    System.out.println(d + " : " + round(d, 2));
    // output is 3.154
    System.out.println(d + " : " + round(d, 3));
  }

  public static double round(double d, int decimalPlace){
    // see the Javadoc about why we use a String in the constructor
    // http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double)
    BigDecimal bd = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
  }
}

3

ฟังก์ชัน Math.round ทำงานมากเกินไปเมื่อได้รับค่า float จะให้ int ตัวอย่างเช่นนี้จะได้ผล

int a=Math.round(1.7f);

เมื่อได้รับค่าสองค่าจะให้ค่า long ดังนั้นคุณต้องพิมพ์เป็น int

int a=(int)Math.round(1.7);

สิ่งนี้ทำเพื่อป้องกันการสูญเสียความแม่นยำ ค่าคู่ของคุณคือ 64 บิต แต่ตัวแปร int ของคุณสามารถจัดเก็บได้เพียง 32 บิตดังนั้นจึงแปลงเป็นแบบยาวซึ่งเป็น 64 บิต แต่คุณสามารถพิมพ์เป็น 32 บิตได้ตามที่อธิบายไว้ข้างต้น


1

เอกสารMath.roundระบุว่า:

ผลตอบแทนการปัดเศษโต้แย้งไปยังจำนวนเต็ม ผลลัพธ์เทียบเท่ากับ(int) Math.floor(f+0.5).

intไม่จำเป็นต้องโยนไป บางทีมันอาจจะเปลี่ยนไปจากอดีต


4
มี 2 ​​วิธี Math.round ค่าที่รับ float จะส่งกลับจำนวนเต็มซึ่งถูกต้อง แต่สิ่งที่ใช้เวลาสองเท่าจะให้ผลตอบแทนที่ยาวนาน
Dominik Ehrenberg


-1

คุณต้องโพสต์ตัวอย่างที่สมบูรณ์มากขึ้นเพื่อให้เราเห็นสิ่งที่คุณพยายามทำ จากสิ่งที่คุณโพสต์นี่คือสิ่งที่ฉันเห็น ประการแรกไม่มีround()วิธีการในตัว คุณต้องเรียกMath.round(n)หรือนำเข้าแบบคงที่Math.roundจากนั้นจึงเรียกอย่างที่คุณมี


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