2011-02-21 12 views
8

Soy nuevo en Groovy.extraño operador de división en Groovy

por qué esto arroja una excepción en tiempo de ejecución:

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

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

mientras que éstos están bien:

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

y

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

favor nos dicen la excepción. –

+0

groovy.lang.MissingMethodException: Sin firma de método: [I.getAt() es aplicable para los tipos de argumento: (java.math.BigDecimal) values: [2] Posibles soluciones: 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

Respuesta

11

En maravilloso una división da lugar a una BigDecimal si los operandos son del tipo Integer, Long, BigInteger o BigDecimal:

Véase, por ejemplo this tutorial:

Los operadores de división "/" y "/ =" produzca un resultado doble si alguno de los operandos es o bien flotar o doble y un resultado BigDecimal lo contrario (tanto los operandos son cualquier combinación de Integer, Long, BigInteger o BigDecimal).

[...]

Por ejemplo

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

[...]

división de enteros puede llevarse a cabo en los tipos integrales por colada el resultado de la división de. Por ejemplo:

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

Todos los tipos numéricos también admiten el método 'intdiv()' que le permite hacer una división entera sin fundición, por ej. 'assert 3.intdiv (2) == 1I' – ataylor

Cuestiones relacionadas