Java BigDecimal Möglicher Überlauffehler


78

Ich habe Randbedingungen für Code mit a getestet BigDecimalund festgestellt, dass sich a beim BigDecimalInitialisieren mit dem String "1e2147483647"unerwartet verhält. Es scheint einen Wert zwischen 0und zu haben 1e-2147483647. Wenn ich versuche anzurufen intValue(), bekomme ich eine NegativeArraySizeException. Ich sollte beachten, dass dies 2147483647der Maximalwert einer Ganzzahl auf meinem System ist. Mache ich etwas falsch oder ist das ein Problem mit BigDecimal?

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

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


Danke, ich hatte diese Frage nicht gesehen. Ich war nur überrascht, dass es keine NumberFormatException vom Konstruktor auslöste, wie dies bei einer um eine Ziffer größeren Zahl der Fall ist.
DJMatch3000

Dies ist eher ein Vorschlag als zu wissen, aber es 1e-2147483647ist eine ziemlich große Zahl. Um genau zu sein, log_2(10^2147483647) / 8 / 1024^3 = 0.83...sollte die minimale Größe (in Gigabyte) angegeben werden, um eine so große Zahl wie eine Ganzzahl darzustellen. Vielleicht ist dies eine Art Speicherzuordnungsproblem?
Turing85

3
@ DJMatch3000: Nein, Ihre Eingabe ist gültig und darstellbar, obwohl dies der maximale Exponent ist, für den Sie darstellen können BigDecimal. Dein Fehler ist echt.
Louis Wasserman

Antworten:


87

Nein, Sie scheinen einen legitimen Fehler zu haben. Der Fehler tritt in JDK7 auf, wurde jedoch in JDK8 behoben. Ihre Werte sind korrekt als BigDecimals darstellbar und sollten sich korrekt verhalten, aber nicht.

Die Verfolgung durch den Quellcode vonBigDecimal in Zeile 2585 this.precision()ist 1 und this.scaleist -2147483647. this.precision() - this.scaledaher Überläufe, und der folgende Überlauf wird nicht korrekt behandelt.

Dieser Fehler wurde in JDK8 durch Subtraktion in longArithmetik behoben .


Funktioniert dies in Java von Android 17 (ähnlich wie JDK6)?
Ben Leggiero
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.