11

In Java, most of the primitive types are signed (one bit is used to represent the +/-), and therefore when I exceed the limits of the type, I can get unexpected results, like negative numbers.

Is there any better solution than using BigInteger for this, since BigInteger has performance issues and you need to use the class methods for basic arithmetic instead of the language operators (ruins readability)?

Alon Gubkin
  • 56,458
  • 54
  • 195
  • 288

3 Answers3

12

No, there is not a better solution. If you are working with values that cannot fit into a long or a double then you will need to use a reference type like BigInteger, and Java does not support operator overloading.

Technically, I suppose you could have some mapping between signed and unsigned values, but if your goal is clean and simple code then this is not at all the way to go.

danben
  • 80,905
  • 18
  • 123
  • 145
  • +1 "it is pretty depressing to convert your beautiful code to work with the BigInteger" Your beatiful code show know the order of magnituded of the values involved, and the limitations of your datatypes. Few practical use cases could overflow a long (64-bit signed integer), and these should be identifiable. – leonbloy May 05 '10 at 20:20
  • There should be something between `long` and BigInteger. BigInteger is way too bulky. – Pacerier Aug 14 '14 at 03:22
  • Actually, BigInteger is not very bulky. Any type "inbetween" would not be any more lightweight. – Rudy Velthuis Jul 19 '16 at 11:26
5

Scala is really the solution here. In that language "operators" are really just in-fixed methods, and can be defined for arbitrary classes. In fact in your case they already are in the standard library. So you can have the power of special number representations but the clean syntax of Java primitive types.

Scala is battle-hardened and will be fully interoperable with your Java code.

Yuvi Masory
  • 2,644
  • 2
  • 27
  • 36
1

The only way for still having beautiful buisiness logic is using a script language, which you compile to java classes. Internally you can use BigIntegers then.

Daniel
  • 27,718
  • 20
  • 89
  • 133