Làm tròn một đôi để biến nó thành một int (java)


119

Ngay bây giờ tôi đang thử điều này:

int a = round(n);

ở đâu na doublenhưng nó không hoạt động. Tôi đang làm gì sai?


bản sao có thể có của stackoverflow.com/questions/153724/…
Matt Ball

6
Bạn thực sự nên giải thích "không làm việc" chi tiết hơn. Điều gì xảy ra? Điều gì xảy ra không? Những gì bạn đã mong đợi? Bạn đã mắc lỗi gì? Bạn có round()phương pháp nào trong cùng một lớp không? Bạn đã làm import static java.lang.Math.*? Vv .. Có rất nhiều cách để làm tròn số và do đó cũng có rất nhiều câu trả lời có thể. Nói cách khác, câu hỏi của bạn rất mơ hồ và không rõ ràng và không thể được trả lời hợp lý ở dạng hiện tại. Nó đang quay trong bóng tối.
BalusC

1
"Không hoạt động" có nghĩa là không làm tròn đến int gần nhất, hoặc ném ngoại lệ, hoặc không làm tròn lên / xuống? Câu hỏi này là vô ích nếu không cần phải tham chiếu chéo ngữ cảnh với câu trả lời.
modulitos

Câu trả lời:


239

Kiểu trả về của round()phương thức trong đoạn mã là gì?

Nếu đây là Math.round()phương thức, nó trả về giá trị Long khi tham số đầu vào là Double.

Vì vậy, bạn sẽ phải truyền giá trị trả về:

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

1
Cân nhắc sử dụng Math.toIntExact (long) thay vì chỉ truyền đến một int; một đôi có thể chứa khá nhiều giá trị và bạn có thể không muốn âm thầm ném ra những bit quan trọng nhất nếu số kép của bạn lớn hơn bạn mong đợi.
othp

Tôi tin rằng dàn diễn viên là không cần thiết. Tôi không biết nếu nó là trong quá khứ, nhưng vòng hiện trả về int.
Bỏ học

@Dropout Math.round trả về giá trị int nếu bạn cho nó là float và long nếu bạn đặt nó là double.
Tur1ng

27

Nếu bạn không thích Math.round (), bạn cũng có thể sử dụng cách tiếp cận đơn giản này:

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

4
Rõ ràng là không có lý do có giá trị cho không thích Math.round(): stackoverflow.com/a/6468757/1715716
Gauthier Boaglio

3
Giải pháp này ngắn hơn, không cần nhập và có thể chuyển sang nhiều ngôn ngữ lập trình khác với những thay đổi tối thiểu. Và nó thậm chí có thể nhanh hơn tùy thuộc vào nền tảng của bạn: stackoverflow.com/questions/12091014/…
Tiến sĩ Daniel Thommes

1
Tôi không chỉ trích câu trả lời của bạn, mà tôi thấy rất hữu ích cho lý do bạn đề cập. Theo nhận xét này, tôi đã đề cập đến những người sẽ ngại sử dụng Math.round(), điều này "theo nghĩa đen" giống như giải pháp bạn cung cấp, đó là tất cả. Chúc mừng.
Gauthier Boaglio

2
Đúng, như nehz đã nói, tôi tin rằng điều này sẽ làm tròn -2,1 thành -1 chẳng hạn.
Ben Aaronson,

5
@AlbertoHormazabal, bạn có để ý rằng anh ấy đã thêm 0.5không?
Sasha

11

Làm tròn gấp đôi thành số nguyên "gần nhất" như sau:

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;          
    }
}

Bạn có thể thay đổi điều kiện (kết quả <0,5) theo ý muốn.


Tôi đồng ý với câu trả lời của anivaler. Nhưng nếu bạn chỉ cần làm tròn số nguyên cao nhất, bạn có thể làm như sau: double decimalNumber = 4,56777; System.out.println (new Float (Math.round (decimalNumber))); Đầu ra: 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

Hàm Math.round bị quá tải Khi nó nhận một giá trị float, nó sẽ cung cấp cho bạn một giá trị int. Ví dụ, điều này sẽ hoạt động.

int a=Math.round(1.7f);

Khi nó nhận được giá trị gấp đôi, nó sẽ cung cấp cho bạn một giá trị dài, do đó bạn phải nhập nó thành int.

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

Điều này được thực hiện để tránh mất độ chính xác. Giá trị kép của bạn là 64bit, nhưng sau đó biến int của bạn chỉ có thể lưu trữ 32bit nên nó chỉ chuyển đổi nó thành long, là 64bit nhưng bạn có thể nhập nó thành 32bit như đã giải thích ở trên.


1

Tài liệu về Math.roundnói:

Trả về kết quả của việc làm tròn đối số thành một số nguyên . Kết quả tương đương với (int) Math.floor(f+0.5).

Không cần truyền đến int. Có lẽ nó đã được thay đổi so với quá khứ.


4
Có 2 phương pháp Math.round. Phương thức nhận float trả về một số nguyên, điều đó đúng. Nhưng một trong những mất một gấp đôi trả lại một thời gian dài.
Dominik Ehrenberg

0
public static int round(double d) {
    if (d > 0) {
        return (int) (d + 0.5);
    } else {
        return (int) (d - 0.5);
    }
}

-1

Bạn thực sự cần đăng một ví dụ đầy đủ hơn, để chúng tôi có thể thấy những gì bạn đang cố gắng làm. Từ những gì bạn đã đăng, đây là những gì tôi có thể thấy. Đầu tiên, không có round()phương pháp tích hợp sẵn. Bạn cần gọi Math.round(n)hoặc nhập tĩnh Math.round, rồi gọi nó như cách bạn có.


Không có hàm toàn cục nào trong java, để bắt đầu.
Danon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.