2011-09-16 57 views
59

Tôi vừa viết một phương pháp nhỏ để đếm số trang cho SMS điện thoại di động. Tôi không có tùy chọn để làm tròn lên bằng cách sử dụng Math.ceil, và thực sự nó có vẻ rất xấu xí.Làm thế nào để làm tròn phân chia số nguyên và có kết quả int trong Java?

Đây là mã của tôi:

public class Main { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    String message = "today we stumbled upon a huge performance leak while optimizing a raycasting algorithm. Much to our surprise, the Math.floor() method took almost half of the calculation time: 3 floor operations took the same amount of time as one trilinear interpolation. Since we could not belive that the floor-method could produce such a enourmous overhead, we wrote a small test program that reproduce"; 

    System.out.printf("COunt is %d ",(int)messagePageCount(message)); 



} 

public static double messagePageCount(String message){ 
    if(message.trim().isEmpty() || message.trim().length() == 0){ 
     return 0; 
    } else{ 
     if(message.length() <= 160){ 
      return 1; 
     } else { 
      return Math.ceil((double)message.length()/153); 
     } 
    } 
} 

tôi không thực sự thích đoạn mã này và tôi đang tìm kiếm một cách thanh lịch hơn để làm điều này. Với điều này, tôi mong đợi 3 và không 3.0000000. Bất kỳ ý tưởng?

+1

có thể trùng lặp với [Làm thế nào để làm tròn kết quả của bộ phận số nguyên] (http: // stackoverflow.com/questions/17944/how-to-round-up-the-kết quả-of-số nguyên-phân chia) – Raedwald

Trả lời

79

Để làm tròn lên một bộ phận nguyên bạn có thể sử dụng

import static java.lang.Math.abs; 

public static long roundUp(long num, long divisor) { 
    int sign = (num > 0 ? 1 : -1) * (divisor > 0 ? 1 : -1); 
    return sign * (abs(num) + abs(divisor) - 1)/abs(divisor); 
} 

hoặc nếu cả hai con số này là tích cực

public static long roundUp(long num, long divisor) { 
    return (num + divisor - 1)/divisor; 
} 
+0

Lưu ý rằng điều này chỉ hoạt động cho 'num> = 0'. – user905686

+0

Nó làm tròn đến vô cùng tích cực. Nó không tròn từ số không, đó là một lựa chọn khác. –

+2

Ý tôi là, thử 'num = -2' và' div = -3'. Điều này kết thúc bằng '-6/-3 = 2' nhưng' 0,666..' phải được làm tròn thành '1'. Thực ra nó không hoạt động với 'num <= 0 && div <= 0'. – user905686

10
(message.length() + 152)/153 

Điều này sẽ cung cấp số nguyên "được làm tròn".

0

này có thể là hữu ích ,, Trừ thời gian còn lại cho legnth và làm cho nó một số chia nhỏ và sau đó chia số này với 153

int r=message.length()%153;  //Calculate the remainder by %153 
return (message.length()-r)/153; // find the pages by adding the remainder and 
            //then divide by 153 
1

Ví dụ panding trên giải pháp Phêrô, đây là những gì tôi đã tìm thấy công trình cho tôi để luôn tròn 'về phía dương vô cực':

public static long divideAndRoundUp(long num, long divisor) { 
    if (num == 0 || divisor == 0) { return 0; } 

    int sign = (num > 0 ? 1 : -1) * (divisor > 0 ? 1 : -1); 

    if (sign > 0) { 
     return (num + divisor - 1)/divisor; 
    } 
    else { 
     return (num/divisor); 
    } 
} 
+0

Chia cho số không bằng không, nhưng phải là lỗi. –

95

Sử dụng Math.ceil() và đúc kết quả để int:

  • này vẫn nhanh hơn là hơn để tránh tăng gấp đôi bằng cách sử dụng abs().
  • Kết quả là đúng khi làm việc với âm, bởi vì -0,999 sẽ được làm tròn UP đến 0

Ví dụ:

(int) Math.ceil((double)divident/divisor); 
+3

Đây phải là câu trả lời đúng – Duane

+1

@Duane OP cho biết "Tôi không có tùy chọn để làm tròn lên bằng cách sử dụng Math.ceil" – Hemmels

+0

Điểm công bằng, mặc dù tôi nghĩ đây là lần "làm tròn toán" hàng đầu trên google ngay bây giờ :) . Xấu hổ nó có tình trạng đó. – Duane

6
long numberOfPages = new BigDecimal(resultsSize).divide(new BigDecimal(pageSize), RoundingMode.UP).longValue(); 
+0

+1 để sử dụng các chức năng sẵn có –

21

Một one-liner đó không phải là quá phức tạp:

private int countNumberOfPages(int numberOfObjects, int pageSize) { 
    return numberOfObjects/pageSize + (numberOfObjects % pageSize == 0 ? 0 : 1); 
} 

Có thể sử dụng lâu thay vì int; chỉ cần thay đổi kiểu tham số và kiểu trả về.

+2

Đây phải là câu trả lời. Nó có lẽ là phương pháp dễ nhất để thực hiện và tránh không thực hiện thêm bất kỳ bước không cần thiết nào. Nó cũng tránh các vấn đề bổ sung nhỏ khi truyền sang các loại số khác nhau. –

+0

Giải pháp tốt. cảm ơn – ghui

1

Nếu bạn muốn tính toán một chia cho b làm tròn lên, bạn có thể sử dụng (a + (- a% b))/b

0

nếu bạn muốn nhập khẩu không có gì, tôi đề nghị này:

int var = message.length()/153; //you can put any integer instead of 153 depend on your case 
if(message.length() % 153 != 0) 
    var = var + 1; 
8

ổi thư viện của Google handles this in the IntMath class:

IntMath.divide(numerator, divisor, RoundingMode.CEILING); 

Không giống như nhiều câu trả lời ở đây, nó xử lý số âm. Nó cũng ném một ngoại lệ thích hợp khi cố gắng chia cho số không.

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