Я новичок в Groovy.
, почему это вызывает исключение во время выполнения:
int[] a = [1,2,3,4,5] int lo=0 int hi=4 int x = a[(lo+hi)/2] assert x == 3
, пока все в порядке:
int x = a[(int)(lo+hi)/2]
и
int i = (lo+hi)/2 int x = a[i]
В Groovy деление приводит к BigDecimal, если операнды имеют тип Integer, Long, BigInteger или BigDecimal:
BigDecimal
Integer
Long
BigInteger
См., Например, это руководство :
Операторы деления "/" и "/ =" выдают двойной результат, если любой из операндов является либо Float, либо Double, и BigDecimal, в противном случае (оба операндалюбая комбинация Integer, Long, BigInteger или BigDecimal). [...] Например 1/2 == new java.math.BigDecimal("0.5"); [...] Целочисленное деление может быть выполнено для целых типов путем приведения результата деления .Например: assert (int)(3/2) == 1I;
Операторы деления "/" и "/ =" выдают двойной результат, если любой из операндов является либо Float, либо Double, и BigDecimal, в противном случае (оба операндалюбая комбинация Integer, Long, BigInteger или BigDecimal).
[...]
Например
1/2 == new java.math.BigDecimal("0.5");
Целочисленное деление может быть выполнено для целых типов путем приведения результата деления .Например:
assert (int)(3/2) == 1I;