2011-02-21 22 views
8

Tôi mới sử dụng Groovy.toán tử phân chia kỳ lạ trong Groovy

tại sao điều này ném ngoại lệ về thời gian chạy:

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

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

trong khi đây là những ok:

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

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

Vui lòng cho chúng tôi biết ngoại lệ. –

+0

groovy.lang.MissingMethodException: Không có chữ ký của phương thức: [I.getAt() được áp dụng cho các loại đối số: (java.math.BigDecimal) giá trị: [2] Các giải pháp có thể có: 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

Trả lời

11

Trong groovy một kết quả phân chia trong một BigDecimal nếu toán hạng là của loại Integer, Long, BigInteger hoặc BigDecimal:

Xem ví dụ this tutorial:

Các nhà khai thác phân chia "/" và "/ =" tạo ra một kết quả kép nếu một trong hai toán hạng là một trong hai nổi hoặc giường đôi và một kết quả BigDecimal khác (cả toán hạng là bất kỳ kết hợp nào của Integer, Long, BigInteger hoặc BigDecimal).

[...]

Ví dụ

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

[...]

Phép chia số nguyên có thể được thực hiện trên các loại không thể thiếu bằng cách đúc kết quả của việc phân chia. Ví dụ:

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

Tất cả các kiểu số cũng hỗ trợ phương thức 'intdiv()' cho phép bạn phân chia số nguyên mà không cần đúc, ví dụ 'assert 3.intdiv (2) == 1I' – ataylor

Các vấn đề liên quan