Ich habe Randbedingungen für Code mit a getestet BigDecimal
und festgestellt, dass sich a beim BigDecimal
Initialisieren mit dem String "1e2147483647"
unerwartet verhält. Es scheint einen Wert zwischen 0
und zu haben 1e-2147483647
. Wenn ich versuche anzurufen intValue()
, bekomme ich eine NegativeArraySizeException
. Ich sollte beachten, dass dies 2147483647
der 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
java
bigdecimal
DJMatch3000
quelle
quelle
1e-2147483647
ist 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?BigDecimal
. Dein Fehler ist echt.Antworten:
Nein, Sie scheinen einen legitimen Fehler zu haben. Der Fehler tritt in JDK7 auf, wurde jedoch in JDK8 behoben. Ihre Werte sind korrekt als
BigDecimal
s darstellbar und sollten sich korrekt verhalten, aber nicht.Die Verfolgung durch den Quellcode von
BigDecimal
in Zeile 2585this.precision()
ist 1 undthis.scale
ist-2147483647
.this.precision() - this.scale
daher Überläufe, und der folgende Überlauf wird nicht korrekt behandelt.Dieser Fehler wurde in JDK8 durch Subtraktion in
long
Arithmetik behoben .quelle