2011-02-04 59 views
6

Có vẻ như câu hỏi đơn giản nhưng Tôi thực sự mút toán học và vài ví dụ trực tuyến mà tôi đã tìm kiếm có vẻ không hoạt động đối với tôi. (Kết quả chỉ trả về giá trị giống như đầu vào vv)Java - Làm thế nào để làm tròn giá trị float (hoặc BigDecimal) bằng 0,5?

Ví dụ .. nhưng nó trong C không Java Round to Next .05 in C

Vì vậy, mục tiêu của tôi là tôi có %.1f định dạng float hoặc double hoặc big decimal và muốn tròn nó lên đến gần .5

example: 

1.3 --> 1.5 
5.5 --> 5.5 
2.4 --> 2.5 
3.6 --> 4.0 
7.9 --> 8.0 

tôi đã cố gắng theo gương nhưng đã không làm việc :(dưới đây chỉ ra 1.3 được giá trị ban đầu. tôi muốn nó được 1,5

public class tmp { 

    public static void main(String[] args) { 

     double foo = 1.3; 

     double mid = 20 * foo; 

     System.out.println("mid " + mid); 

     double out = Math.ceil(mid); 

     System.out.println("out after ceil " + out); 

     System.out.printf("%.1f\n", out/20.0); 
    } 
} 

Trả lời

8

Nhân (và sau đó chia) cho 2, không phải 20, nên thực hiện thủ thuật.

+0

omg nó hoạt động !! : D cảm ơn! Tôi nên học Toán là nhà phát triển! Tôi thậm chí có thể làm cùng một vòng xuống với sàn() quá, tuyệt vời –

17

Dưới đây là một phương pháp đơn giản:

public static float roundToHalf(float x) { 
    return (float) (Math.ceil(x * 2)/2); 
} 

này tăng gấp đôi giá trị, mất trần của nó, và cắt nó trở lại một nửa.

+0

Cảm ơn mã mẫu :) +1 –

4
double nearestPoint5 = Math.ceil(d * 2)/2; 
4

Xem Big Decimal Javadoc về việc tại sao một String được sử dụng trong các nhà xây dựng

public static double round(double d, int decimalPlace){ 
    BigDecimal bd = new BigDecimal(Double.toString(d)); 
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP); 
    return bd.doubleValue(); 
} 
1

Nếu không sử dụng một chức năng, bạn có thể làm

double rounded = (double)(long)(x * 2 + 0.5)/2; 

Lưu ý: đây sẽ vòng về phía vô cùng.

4

Công thức dưới đây không làm việc tốt cho số như 2,16

public static float roundToHalf(float x) { 
    return (float) (Math.ceil(x * 2)/2); 
} 

Câu trả lời chính xác nên được 2.0, nhưng các phương pháp trên cho 2,5

Mã đúng nên là:

public static double round(float d) 
{ 
    return 0.5 * Math.round(d * 2); 
} 
-1

Một số câu trả lời khác không chính xác (Math.round nên được sử dụng, không phải Math.floor hoặc Math.ceil) và các câu trả lời khác y làm việc để làm tròn đến 0,5 (đó là câu hỏi được hỏi, có). Đây là một phương pháp đơn giản làm tròn chính xác đến mức gấp đôi tùy ý gần nhất, với một kiểm tra để đảm bảo rằng đó là một số dương.

public static double roundToNearest(double d, double toNearest) { 
    if (toNearest <= 0) { 
     throw new IllegalArgumentException(
       "toNearest must be positive, encountered " + toNearest); 
    } 
    return Math.round(d/toNearest) * toNearest; 
} 
Các vấn đề liên quan