2009-03-20 8 views
21

Tôi muốn biết cách nhận phần còn lại và thương trong một giá trị trong Java.Làm cách nào để chia để tôi nhận được giá trị thập phân?

Ví dụ:

3/2 tôi sẽ nhận được giá trị 1.5.

Nếu tôi sử dụng toán tử /, tôi chỉ nhận được thương. Nếu tôi sử dụng toán tử %, tôi chỉ nhận được phần còn lại. Làm thế nào để tôi nhận được cả hai cùng một lúc trong cùng một biến?

Trả lời

15

Trong ví dụ của bạn, Java đang thực hiện số nguyên số học, làm tròn kết quả của bộ phận.

Dựa trên câu hỏi của bạn, bạn muốn thực hiện số học dấu phẩy động. Để làm như vậy, ít nhất là một trong những điều khoản của bạn phải được xác định như (hoặc chuyển đổi sang) dấu chấm động:

Xác định điểm nổi:

3.0/2 
3.0/2.0 
3/2.0 

Chuyển đổi sang dấu chấm động:

int a = 2; 
int b = 3; 
float q = ((float)a)/b; 

hoặc

double q = ((double)a)/b; 

(Xem Java Traps: doubleJava Floating-Point Number Intricacies để thảo luận về floatdouble)

55
quotient = 3/2; 
remainder = 3 % 2; 

// now you have them both 
+0

trong Java nó sẽ không làm việc, nếu bạn làm 1,0% 0,1 – endless

+2

@endless: Đúng, bạn phải chuyển đổi thành số nguyên đầu tiên. Và bạn cũng phải xác định ý nghĩa của phần còn lại của hai phao, vì nó thường được định nghĩa dưới dạng số học số nguyên. – recursive

+0

Nếu ai đó đi qua câu hỏi này và tự hỏi làm thế nào bạn sẽ không nhận được thương, nhưng số tự nhiên lớn nhất <= thương hoặc mod bạn có thể sử dụng hàm trong gói toán học: 'Math.floorDiv (x, y)' và 'Math.floorMod (x, y)' –

7

Đừng lo lắng về điều đó. Trong mã của bạn, chỉ cần thực hiện các hoạt động riêng biệt và% như bạn đề cập, mặc dù nó có vẻ như nó không hiệu quả. Để trình biên dịch JIT lo lắng về việc kết hợp các hoạt động này để có được cả thương và số dư trong một lệnh máy đơn (theo như tôi nhớ lại, nó thường làm).

8

Kiểm tra này ra: http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html#divideAndRemainder%28java.math.BigDecimal%29

Bạn chỉ cần quấn int hoặc dài biến của bạn trong một BigDecimal đối tượng , sau đó gọi phương pháp divideAndRemainder trên đó. Mảng trả về sẽ chứa thương và phần còn lại (theo thứ tự đó).

+0

đề xuất tuyệt vời. – Buffalo

+0

Đây là một câu trả lời tuyệt vời ở chỗ nó trả lời những gì OP đang tìm kiếm. Người ta không cần phải hỏi mặc dù không từ bỏ sử dụng một nguyên thủy 32 bit cho một BigDecimal chống lại bất kỳ tiết kiệm mà một trong những lý thuyết sẽ nhận được (nếu trình biên dịch đã không thực hiện tối ưu cho bạn)? – demongolem

1

Nếu bạn khởi tạo cả hai tham số là float, bạn chắc chắn sẽ nhận được giá trị chia thực tế. Ví dụ:

float RoomWidth, TileWidth, NumTiles; 
RoomWidth = 142; 
TileWidth = 8; 
NumTiles = RoomWidth/TileWidth; 

Ans: 17,75.

1
int a = 3; 
int b = 2; 
float c = ((float)a)/b 
+0

Bạn có thể cải thiện câu trả lời này bằng cách mô tả ngắn gọn mã của bạn. Ví dụ tại sao nó cần thiết để chuyển đổi thành một phao trước khi phân chia. –

+0

Nó hoạt động. Cảm ơn – JITHIN

0

@ solusion đệ quy của (Câu trả lời được chấp nhận) là 100% đúng. Tôi chỉ cần thêm một mã mẫu để bạn tham khảo.

Trường hợp của tôi là hiển thị giá với hai chữ số thập phân.Đây là một phần của phản hồi back-end: "price": 2300, "currencySymbol": "CD", ....

Đây là lớp helper của tôi:

public class CurrencyUtils 
{ 
    private static final String[] suffix = { "", "K", "M" }; 

    public static String getCompactStringForDisplay(final int amount) 
    { 
     int suffixIndex; 
     if (amount >= 1_000_000) { 
      suffixIndex = 2; 
     } else if (amount >= 1_000) { 
      suffixIndex = 1; 
     } else { 
      suffixIndex = 0; 
     } 

     int quotient; 
     int remainder; 
     if (amount >= 1_000_000) { 
      quotient = amount/1_000_000; 
      remainder = amount % 1_000_000; 
     } else if (amount >= 1_000) { 
      quotient = amount/1_000; 
      remainder = amount % 1_000; 
     } else { 
      return String.valueOf(amount); 
     } 

     if (remainder == 0) { 
      return String.valueOf(quotient) + suffix[suffixIndex]; 
     } 

     // Keep two most significant digits 
     if (remainder >= 10_000) { 
      remainder /= 10_000; 
     } else if (remainder >= 1_000) { 
      remainder /= 1_000; 
     } else if (remainder >= 100) { 
      remainder /= 10; 
     } 

     return String.valueOf(quotient) + '.' + String.valueOf(remainder) + suffix[suffixIndex]; 
    } 
} 

Đây là lớp học của tôi thử nghiệm (dựa trên JUnit 4):

public class CurrencyUtilsTest { 

    @Test 
    public void getCompactStringForDisplay() throws Exception { 
     int[] numbers = {0, 5, 999, 1_000, 5_821, 10_500, 101_800, 2_000_000, 7_800_000, 92_150_000, 123_200_000, 9_999_999}; 
     String[] expected = {"0", "5", "999", "1K", "5.82K", "10.50K", "101.80K", "2M", "7.80M", "92.15M", "123.20M", "9.99M"}; 

     for (int i = 0; i < numbers.length; i++) { 
      int n = numbers[i]; 
      String formatted = CurrencyUtils.getCompactStringForDisplay(n); 
      System.out.println(n + " => " + formatted); 

      assertEquals(expected[i], formatted); 
     } 
    } 

}