2011-02-21 10 views
8

Sono nuovo di Groovy.strano operatore di divisione in Groovy

perché questo genera un'eccezione in fase di esecuzione:

int[] a = [1,2,3,4,5] 
int lo=0 
int hi=4 

int x = a[(lo+hi)/2] 
assert x == 3 

mentre questi sono ok:

int x = a[(int)(lo+hi)/2] 

e

int i = (lo+hi)/2 
int x = a[i] 
+0

Per favore dicci l'eccezione. –

+0

groovy.lang.MissingMethodException: Nessuna firma del metodo: [I.getAt() è applicabile per i tipi di argomento: (java.math.BigDecimal) valori: [2] Possibili soluzioni: getAt (groovy.lang.Range), getAt (java.lang.Integer), getAt (java.util.Collection), getAt (groovy.lang.ObjectRange), getAt (groovy.lang.IntRange), getAt (java.lang.String) – hint

risposta

11

in Groovy una divisione si traduce in una BigDecimal se gli operandi sono di tipo Integer, Long, BigInteger o BigDecimal:

veda ad esempio this tutorial:

Gli operatori di divisione "/" e "/ =" produrre un doppio risultato se uno degli operandi è o Float o Double e un risultato BigDecimal altrimenti (sia gli operandi sono qualsiasi combinazione di Integer, Long, BigInteger o BigDecimal).

[...]

Ad esempio

1/2 == new java.math.BigDecimal("0.5"); 

[...]

divisione di interi può essere eseguita sui tipi integrali colando il risultato della divisione. Ad esempio:

assert (int)(3/2) == 1I; 
+3

Supporta anche tutti i tipi numerici il metodo 'intdiv()' che consente di eseguire la divisione intera senza eseguire il cast, ad es 'assert 3.intdiv (2) == 1I' – ataylor