2015-07-01 10 views
78

Stavo testando le condizioni al contorno su un codice che includeva uno BigDecimal e ho notato che quando un BigDecimal viene inizializzato con lo String "1e2147483647", si comporta in modo imprevisto. Sembra avere un valore compreso tra 0 e 1e-2147483647. Quando provo a chiamare intValue(), ottengo uno NegativeArraySizeException. Devo notare che 2147483647 è il valore massimo di un intero sul mio sistema. Sto facendo qualcosa di sbagliato, o questo è un problema con BigDecimal?Errore di overflow Java BigDecimal possibile

BigDecimal test = new BigDecimal("1e2147483647"); 

test.compareTo(new BigDecimal(0)); //Returns 1 
test.compareTo(new BigDecimal("1e-2147483647")); //Returns -1 
test.intValue(); //Throws NegativeArraySizeException 
+0

http://stackoverflow.com/questions/17945985/what-are-the-limits-of-bigdecimal-and-biginteger – kosa

+0

Grazie, non avevo visto quella domanda. Sono rimasto sorpreso che non abbia lanciato una NumberFormatException dal costruttore come fa per un numero più grande di un numero. – DJMatch3000

+0

Questo è più un suggerimento che sapere, ma '1e-2147483647' è un numero piuttosto grande. Per essere precisi, 'log_2 (10^2147483647)/8/1024^3 = 0.83 ...' dovrebbe fornire la dimensione minima (in Gigabyte) per rappresentare un numero così grande come numero intero. Forse questa è una sorta di problema di allocazione della memoria? – Turing85

risposta

87

No, sembra che ci sia un bug legittimo. Il bug si presenta in JDK7 ma è stato risolto in JDK8. I tuoi valori sono correttamente rappresentabili come BigDecimal s, e dovrebbero comportarsi correttamente, ma non farlo.

Il tracciamento tramite the source code of BigDecimal, sulla linea 2585, this.precision() è 1 e this.scale è -2147483647. this.precision() - this.scale pertanto si verifica un overflow e il seguente overflow non viene gestito correttamente.

Questo errore has been fixed in JDK8 entro il doing the subtraction in long arithmetic.

+0

Funziona in Java di Android 17 (simile a JDK6)? –

Problemi correlati