2010-05-05 23 views
11

In Java sind die meisten primitiven Typen signiert (ein Bit wird verwendet, um die +/- darzustellen), und deshalb, wenn ich die Grenzen des Typs überschreite, kann ich unerwartete Ergebnisse erhalten, wie negative Zahlen.BigInteger oder nicht BigInteger?

Gibt es eine bessere Lösung als die Verwendung von BigInteger, da BigInteger Leistungsprobleme hat und Sie die Klassenmethoden für grundlegende Arithmetik anstelle der Sprachoperatoren verwenden müssen (Ruins Lesbarkeit)?

+0

Warum glauben Sie, dass Sie eine signierte 64-Bit-Länge überschreiten werden? Wofür verwendest du die Nummer? – Pyrolistical

Antwort

11

Nein, es gibt keine bessere Lösung. Wenn Sie mit Werten arbeiten, die nicht in ein Long- oder Double-Format passen, müssen Sie einen Referenztyp wie BigInteger verwenden, und Java unterstützt kein Überladen von Operatoren.

Technisch, nehme ich an, Sie könnten eine Zuordnung zwischen vorzeichenbehafteten und vorzeichenlosen Werten haben, aber wenn Ihr Ziel sauberer und einfacher Code ist, dann ist das überhaupt nicht der richtige Weg.

+0

+1 "Es ist ziemlich deprimierend, Ihren schönen Code in die Arbeit mit dem BigInteger zu konvertieren" Ihre schöne Code-Show kennt die Größenordnung der beteiligten Werte und die Einschränkungen Ihrer Datentypen. Wenige praktische Anwendungsfälle könnten eine lange (64-Bit-Ganzzahl mit Vorzeichen) überlaufen lassen, und diese sollten identifizierbar sein. – leonbloy

+0

Es sollte etwas zwischen 'long' und BigInteger sein. BigInteger ist viel zu sperrig. – Pacerier

+0

Eigentlich ist BigInteger nicht sehr sperrig. Jeder Typ "dazwischen" wäre nicht leichter. –

0

Die einzige Möglichkeit für eine schöne Geschäftslogik ist die Verwendung einer Skriptsprache, die Sie in Java-Klassen kompilieren. Intern können Sie dann BigIntegers verwenden.

4

Scala ist wirklich die Lösung hier. In dieser Sprache sind "Operatoren" wirklich nur fixierte Methoden und können für beliebige Klassen definiert werden. In Ihrem Fall befinden sie sich bereits in der Standardbibliothek. Sie können also die Macht von speziellen Zahlenrepräsentationen haben, aber die saubere Syntax von Java-Primitiven.

Scala ist kampferprobt und wird vollständig mit Ihrem Java-Code interoperabel sein.

+4

Groovy ist auch eine Option in der gleichen Richtung. – Yishai

+0

Ja, Scala ist ein gutes Beispiel für eine Skriptsprache, um dies zu erreichen, vor allem, da es sich um nativen Java Bytecode handelt! – Daniel