2010-05-05 48 views
11

Trong Java, hầu hết các kiểu nguyên thủy được ký (một bit được dùng để biểu diễn +/-), và do đó khi vượt quá giới hạn của kiểu, tôi có thể nhận được kết quả không mong muốn, như số âm.BigInteger hay không BigInteger?

Có giải pháp nào tốt hơn so với sử dụng BigInteger cho điều này không, vì BigInteger có vấn đề về hiệu suất và bạn cần sử dụng các phương pháp lớp cho số học cơ bản thay vì các toán tử ngôn ngữ (khả năng đọc của đống đổ nát)?

+0

Tại sao bạn cho rằng mình sẽ vượt quá 64 bit đã ký? Bạn đang sử dụng số để đại diện? – Pyrolistical

Trả lời

11

Không, không có giải pháp nào tốt hơn. Nếu bạn đang làm việc với các giá trị không thể phù hợp với một giá trị dài hoặc gấp đôi thì bạn sẽ cần phải sử dụng một kiểu tham chiếu như BigInteger và Java không hỗ trợ quá tải toán tử.

Về mặt kỹ thuật, tôi cho rằng bạn có thể có một số ánh xạ giữa các giá trị đã ký và chưa ký, nhưng nếu mục tiêu của bạn là mã đơn giản và sạch sẽ thì đây không phải là cách để thực hiện.

+0

+1 "nó khá buồn để chuyển đổi mã đẹp của bạn để làm việc với BigInteger" Chương trình mã đẹp mắt của bạn biết thứ tự của các giá trị liên quan, và những giới hạn của các kiểu dữ liệu của bạn. Rất ít trường hợp sử dụng thực tế có thể tràn một số nguyên dài 64 bit và các mã này phải được nhận dạng. – leonbloy

+0

Nên có thứ gì đó giữa 'long' và BigInteger. BigInteger là quá cồng kềnh. – Pacerier

+0

Trên thực tế, BigInteger không phải là rất cồng kềnh. Bất kỳ loại "inbetween" nào sẽ không có trọng lượng nhẹ hơn. –

0

Cách duy nhất để vẫn có logic kinh doanh đẹp là sử dụng ngôn ngữ kịch bản mà bạn biên dịch sang các lớp java. Trong nội bộ, bạn có thể sử dụng BigIntegers sau đó.

4

Scala thực sự là giải pháp ở đây. Trong ngôn ngữ đó "các toán tử" thực sự chỉ là các phương thức cố định và có thể được định nghĩa cho các lớp tùy ý. Trong thực tế trong trường hợp của bạn, họ đã có trong thư viện chuẩn. Vì vậy, bạn có thể có sức mạnh của các đại diện số đặc biệt nhưng cú pháp sạch của các kiểu nguyên thủy Java.

Scala là trận chiến cứng và sẽ hoàn toàn tương thích với mã Java của bạn.

+4

Groovy cũng là một tùy chọn dọc theo cùng một dòng. – Yishai

+0

Vâng, Scala là một ví dụ tốt cho một ngôn ngữ kịch bản để đạt được điều này, đặc biệt là kể từ khi nó biên dịch thành Java Bytecode gốc! – Daniel

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