2009-03-20 11 views
21

Voglio sapere come ottenere resto e quoziente in valore singolo in Java.Come divido in modo da ottenere un valore decimale?

Esempio:

3/2 dovrei ottenere valore come 1.5.

Se io uso l'operatore / ottengo solo il quoziente. Se utilizzo l'operatore %, ottengo solo il resto. Come ottengo entrambi alla volta nella stessa variabile?

risposta

15

Nell'esempio, Java sta eseguendo numero intero aritmetico, arrotondando il risultato della divisione.

In base alla tua domanda, ti piacerebbe eseguire l'aritmetica in virgola mobile. Per fare ciò, almeno uno dei vostri termini deve essere specificato come (o convertiti in) floating-point:

Specificando in virgola mobile:

3.0/2 
3.0/2.0 
3/2.0 

Conversione in virgola mobile:

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

o

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

(Vedi Java Traps: double e Java Floating-Point Number Intricacies per le discussioni su float e double)

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

// now you have them both 
+0

in Java non funzionerà, se si fa 1,0% 0,1 – endless

+2

@endless: vero, prima dovresti convertire in intero. E dovresti anche specificare cosa intendi per il resto di due float, poiché di solito è definito in termini di aritmetica intera. – recursive

+0

Solo se qualcuno supera questa domanda e si chiede come otterresti il ​​quoziente, ma il numero naturale più grande <= il quoziente o il mod puoi usare la funzione nel pacchetto matematico: 'Math.floorDiv (x, y)' e 'Math.floorMod (x, y)' –

7

Non preoccuparti di esso. Nel codice, esegui le operazioni separate/e% come menzioni, anche se potrebbe sembrare che sia inefficiente. Lasciamo che il compilatore JIT si preoccupi di sulla combinazione di queste operazioni per ottenere sia il quoziente che il resto in una singola istruzione macchina (per quanto mi ricordo, generalmente lo fa).

8

Check this out: http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html#divideAndRemainder%28java.math.BigDecimal%29

Hai solo bisogno di avvolgere il vostro tempo variabile int o in un BigDecimal oggetto , quindi richiamare il metodo divideAndRemainder su di esso. La matrice restituita conterrà il quoziente e il resto (in questo ordine).

+0

fantastico suggerimento. – Buffalo

+0

Questa è una grande risposta in quanto risponde a ciò che l'OP sta cercando. Bisogna chiedersi se rinunciando a usare una primitiva a 32 bit per un BigDecimal si possa controbilanciare qualsiasi risparmio che si otterrebbe teoricamente (se il compilatore non eseguisse le ottimizzazioni per voi)? – demongolem

1

Se si inizializzano entrambi i parametri come float, si otterrà il valore attuale diviso. Per esempio:

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

Potresti migliorare questa risposta descrivendo brevemente cosa fa il tuo codice. Ad esempio, perché è necessario convertire un float prima della divisione. –

+0

Ha funzionato. Grazie – JITHIN

0

@ solusion di ricorsiva (La risposta accettata) è al 100% a destra. Sto solo aggiungendo un codice di esempio per il tuo riferimento.

Il mio caso è di visualizzare il prezzo con due cifre decimali.Questo fa parte della risposta back-end: "price": 2300, "currencySymbol": "CD", ....

Questa è la mia classe di supporto:

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

Questa è la mia classe di test (sulla base di 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); 
     } 
    } 

} 
Problemi correlati