2014-09-22 16 views
6

Tôi cố gắng để làm tròn các giá trị gấp đôi lên 2 chữ số thập phân, tuy nhiên nó không làm việc trong tất cả các kịch bảnJava Vòng đúp tắt đến 2 chữ số thập phân luôn

public static double round(double value, int places) { 
    if (places < 0) throw new IllegalArgumentException(); 

    BigDecimal bd = new BigDecimal(value); 
    bd = bd.setScale(places, RoundingMode.HALF_UP); 
    return bd.doubleValue(); 
} 

public static void main(String[] args) { 
    System.out.println(round(25.0,2)); //25.0 - expected 25.00 
    System.out.println(round(25.00d,2)); //25.0 - expected 25.00 
    System.out.println(round(25,2)); //25.0 - expected 25.00 
    System.out.println(round(25.666,2)); //25.67 
} 

Nói tóm lại, dù số thập phân tồn tại hay không, luôn giữ các giá trị tối đa 2 thập phân ngay cả khi nó cần thêm các số không.

Mọi trợ giúp đều được đánh giá cao!

+3

Bạn có thể cần sử dụng định dạng thập phân thay vì setScale. –

Trả lời

11

Có hai điều có thể được cải thiện trong mã của bạn.

Trước tiên, hãy truyền hai lần sang BigDecimal để làm tròn nó là cách tiếp cận rất kém hiệu quả. Bạn nên sử dụng Math.round thay vì:

double value = 1.125879D; 
    double valueRounded = Math.round(value * 100D)/100D; 

Thứ hai, khi bạn in hoặc chuyển đổi số thực đến chuỗi, bạn có thể xem xét sử dụng System.out.printf hoặc String.format. Trong trường hợp của bạn bằng cách sử dụng định dạng "% .2f" hiện các trick.

System.out.printf("%.2f", valueRounded); 
+1

Phần "Đầu tiên" chỉ cần thiết nếu bạn cần làm tròn giá trị gấp đôi. Định dạng với độ chính xác cũng làm tròn thích hợp, vì vậy nếu mục tiêu cuối cùng của chương trình của bạn là lấy biểu diễn chuỗi của giá trị được làm tròn, tất cả những gì bạn cần là 'String.format' hoặc' System.out.printf'. – Aivean

+0

Mặc dù vậy không thực sự làm tròn như 'RoundingMode.HALF_UP'. Trong thực tế, đó không phải là làm tròn ở tất cả, chỉ cắt ngắn. –

+2

@DavidConrad Từ quan điểm của tôi, cả hai ví dụ đều hoạt động theo thuật toán RoundingMode.HALF_UP. Hơn nữa, String.format được [khai báo để sử dụng thuật toán này] (http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax) (tìm kiếm 'round half up algorithm' từ khóa ở đó). – Aivean

2

Bạn đang chuyển đổi BigDecimal quay lại double, về cơ bản cắt các số không theo sau.

Bạn có thể trả lại BigDecimal hoặc BigDecimal.toPlainString().

public static String round(double value, int places) { 
    if (places < 0) throw new IllegalArgumentException(); 

    BigDecimal bd = new BigDecimal(value); 
    bd = bd.setScale(places, RoundingMode.HALF_UP); 
    return bd.toPlainString(); 
} 
4

Tôi sử dụng hàm format() của lớp Chuỗi. Mã đơn giản hơn nhiều. Số 2 trong "% .2f" biểu thị số chữ số sau dấu thập phân mà bạn muốn hiển thị. Chữ f trong "% .2f" biểu thị rằng bạn đang in một số dấu phẩy động. Dưới đây là tài liệu về định dạng một chuỗi (http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax)

double number = 12.34567; 
System.out.println(String.format("%.2f", number)); 
2

này sẽ làm việc cho bạn:

public static void main(String[] args) { 

    DecimalFormat two = new DecimalFormat("0.00"); //Make new decimal format 

    System.out.println(two.format(25.0)); 

    System.out.println(two.format(25.00d)); 

    System.out.println(two.format(25)); 

    System.out.println(two.format(25.666)); 

} 
Các vấn đề liên quan