2010-05-05 15 views
11

In Java, la maggior parte dei tipi primitivi sono firmati (un bit è usato per rappresentare il +/-), e quindi quando superi i limiti del tipo, posso ottenere risultati imprevisti, come numeri negativi.BigInteger o non BigInteger?

Esiste una soluzione migliore rispetto all'utilizzo di BigInteger per questo, dal momento che BigInteger presenta problemi di prestazioni ed è necessario utilizzare i metodi di classe per l'aritmetica di base anziché gli operatori del linguaggio (leggibilità delle rovine)?

+0

Perché pensi di superare una lunghezza di 64 bit con segno? Cosa stai usando il numero da rappresentare? – Pyrolistical

risposta

11

No, non esiste una soluzione migliore. Se stai lavorando con valori che non possono essere contenuti in un lungo o in un doppio, dovrai utilizzare un tipo di riferimento come BigInteger e Java non supporta l'overloading dell'operatore.

Tecnicamente, suppongo che potresti avere una mappatura tra valori firmati e non firmati, ma se il tuo obiettivo è un codice semplice e pulito, allora non è affatto la strada da percorrere.

+0

+1 "È piuttosto deprimente convertire il tuo bel codice per lavorare con BigInteger" Il tuo bel codice mostra l'ordine di grandezza dei valori coinvolti e le limitazioni dei tuoi tipi di dati. Pochi casi d'uso pratico potrebbero traboccare un lungo (numero intero con segno a 64 bit) e questi dovrebbero essere identificabili. – leonbloy

+0

Dovrebbe esserci qualcosa tra 'long' e BigInteger. BigInteger è troppo ingombrante. – Pacerier

+0

In realtà, BigInteger non è molto voluminoso. Qualsiasi tipo "inbetween" non sarebbe più leggero. –

0

L'unico modo per avere ancora una bella logica di buisiness è usare un linguaggio di script, che si compila in classi java. Internamente puoi usare BigIntegers allora.

4

Scala è davvero la soluzione qui. In quel linguaggio, gli "operatori" sono in realtà solo metodi fissi e possono essere definiti per classi arbitrarie. Infatti nel tuo caso sono già nella libreria standard. In questo modo puoi avere la potenza delle rappresentazioni numeriche speciali ma la sintassi pulita dei tipi primitivi di Java.

Scala è temprato dalle battaglie e sarà completamente interoperabile con il tuo codice Java.

+4

Groovy è anche un'opzione sulla stessa falsariga. – Yishai

+0

Sì, Scala è un buon esempio per un linguaggio di scripting per ottenere questo, specialmente dal momento che viene compilato in Bytecode Java nativo! – Daniel

Problemi correlati