Prüfen ob Integer zu groß ist
Arbeite ich an einem system für den Austausch und die Benutzer-Einstellung ist der Preis und die Menge für einen Austausch.
Ich will zu machen sicher, dass der exchange ist nicht größer als der Integer maximale Wert, jedoch habe ich ein problem.
Wenn der Betrag der exchange auf 9 oder mehr, auch wenn ich eine überprüfen, um sicherzustellen, dass die Anzahl ist nicht größer als der maximale Wert, es funktioniert nicht. Ich habe getan, einige debugging und bei der Einstellung der Höhe 9, während der Preis 2,147,483,646 (1 weniger als die maximale Anzahl), druckt es aus diesem:
2,147,483,630 - 9
Dies ist meine debugging-code, was sollte ich hinzufügen, um es, um sicherzustellen, dass dies nicht passiert?
public void setPrimaryAmount(int primaryAmount) {
int price = primaryAmount * this.price;
System.out.println(Misc.format(this.price * primaryAmount) + " - " + primaryAmount);
if (price > Integer.MAX_VALUE ||
price == Integer.MAX_VALUE ||
price >= Integer.MAX_VALUE ||
price < 0 || price <= 0 ||
price++ == Integer.MAX_VALUE) {
System.out.println("Attempted to set a bad amount.");
return;
}
this.primaryAmount = primaryAmount;
}
"Versucht, eine schlechte Menge" druckt aus, bis Sie einen Betrag eingeben >= 9.
- Dir ist schon klar, ich hoffe, dass tests wie
price < 0 || price <= 0
sind redundant:price <= 0
ist völlig ausreichend. Ebenfalls fürprice > Integer.MAX_VALUE || price == Integer.MAX_VALUE || price >= Integer.MAX_VALUE
, außer es gibt den zusätzlichen Falten, die eine integer-variable kann eine nie größer sein, alsInteger.MAX_VALUE
soprice == Integer.MAX_VALUE
ist alles, was Sie brauchen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht speichern Sie einen Wert in ein int, und dann überprüfen, um zu sehen, ob es zu groß für ein int. Speichern Sie es in einem langen statt.
In Java 8 ein Ansatz wäre, die Nutzung
welche laut Javadocs wirft einen
ArithmeticException
wenn das Ergebnis überläuft ein int. In anderen Versionen, die ich empfehlen würde, was Flug-Odyssee vorgeschlagen, und verwenden Sie sehnt sich danach, zumindest für diese Art von Prüfungen.Bei der Einstellung 'Preis' zu
primaryAmount * this.price
zu prüfen, ob diese über Integer.MAX_VALUE oder unten Integer.MIN_VALUE, weil es ist eine ganze Zahl wird es Rollen, zum Beispiel, ein Wert von Integer.MAX_VALUE += 1 wird zu Integer.MIN_VALUE-und Umgekehrt-deshalb ist eine Kontrolle nicht erforderlich. Natürlich könnten Sie auch machen es einen größeren Datentyp und dann prüfen, aber es gibt einen schnelleren Weg.Solange wir wissen, was
this.price
ist, können wir bestimmen, was der maximale Wert 'primaryAmount' werden können, ohne überschreitung 2,147,483,646 einmal multipliziert mitthis.price
einfach, indem Sie es rückwärts:Dieser Wert könnte als max für ein einfaches trim-Funktion, um sicherzustellen, dass es innerhalb der Reichweite, e.g: