2009-03-20 10 views
21

Chcę wiedzieć, jak uzyskać resztę i iloraz w pojedynczej wartości w Javie.Jak podzielić, więc otrzymuję wartość dziesiętną?

przykład:

3/2 należy uzyskać wartość jako 1,5.

Jeśli używam operatora /, otrzymuję tylko iloraz. Jeśli użyję operatora %, otrzymam tylko resztę. Jak uzyskać oba naraz w tej samej zmiennej?

Odpowiedz

15

W twoim przykładzie, Java wykonuje liczbę całkowitą arytmetyczną, zaokrąglając wynik podziału.

Na podstawie pytania chciałbyś wykonać arytmetykę zmiennoprzecinkową. Aby to zrobić, co najmniej jeden z Twoich warunkach musi być określona jako (lub przekształca się) zmiennoprzecinkowych:

Określanie zmiennoprzecinkowych:

3.0/2 
3.0/2.0 
3/2.0 

konwersji na zmiennoprzecinkowe:

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

lub

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

(Zobacz Java Traps: double i Java Floating-Point Number Intricacies do dyskusji na float i double)

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

// now you have them both 
+0

w Javie to nie będzie działać, jeśli nie 1,0% 0,1 – endless

+2

@ Bezczasowy: Prawda, najpierw musisz przekonwertować na liczbę całkowitą. Musisz również określić, co masz na myśli przez pozostałą część dwóch zmiennych, ponieważ jest to zwykle określane w kategoriach arytmetyki całkowitej. – recursive

+0

Po prostu, jeśli ktoś przejdzie to pytanie i zastanawia się, w jaki sposób uzyskałbyś nie iloraz, ale największą naturalną liczbę <= iloraz lub mod możesz użyć funkcji w pakiecie matematycznym: 'Math.floorDiv (x, y)' oraz 'Math.floorMod (x, y)' –

7

Nie martw się o niego. W swoim kodzie, po prostu wykonuj oddzielne operacje/i%, jak wspomniałeś, nawet jeśli może się wydawać, że jest to nieefektywne. Pozwolić kompilatorowi JIT obawiać się o połączenie tych operacji, aby uzyskać zarówno iloraz, jak i pozostałość w pojedynczej instrukcji maszyny (o ile pamiętam, ogólnie rzecz biorąc).

8

to sprawdzić: http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html#divideAndRemainder%28java.math.BigDecimal%29

Wystarczy owinąć długie zmienną int lub w BigDecimal obiektu, następnie wywołać divideAndRemainder metodę na nim. Zwrócona tablica będzie zawierać iloraz i resztę (w tej kolejności).

+0

niesamowite sugestie. – Buffalo

+0

To jest świetna odpowiedź, ponieważ odpowiada na to, czego szuka OP. Trzeba jednak zapytać, czy rezygnacja z 32-bitowego prymitywu dla BigDecimala przeciwdziała wszelkim oszczędnościom, które teoretycznie można uzyskać (gdyby kompilator nie wykonał dla ciebie optymalizacji)? – demongolem

1

Jeśli zainicjujesz oba parametry jako float, na pewno otrzymasz rzeczywistą wartość podzieloną. Na przykład

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

Możesz poprawić tę odpowiedź, krótko opisując, co robi Twój kod. Na przykład, dlaczego konieczne jest przekształcenie a w float przed podziałem. –

+0

Zadziałało. Dzięki – JITHIN

0

@ solusion rekurencyjnych'S (Przyjęty odpowiedź) jest w 100% rację. Właśnie dodaję przykładowy kod do twojego odniesienia.

Moja sprawa to wyświetlenie ceny z dwoma cyframi dziesiętnymi.Jest to część odpowiedzi zaplecza: "price": 2300, "currencySymbol": "CD", ....

To moja klasa pomocnika:

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

To moja klasa testu (na podstawie 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); 
     } 
    } 

} 
Powiązane problemy