Wie mache ich eine Integer.parseInt () für eine Dezimalzahl?


76

Der Java-Code lautet wie folgt:

String s = "0.01";
int i = Integer.parseInt(s);

Dies löst jedoch eine NumberFormatException aus ... Was könnte schief gehen?

Antworten:


66

0,01 ist keine ganze Zahl (ganze Zahl), daher können Sie sie natürlich nicht als eine analysieren. Verwenden Sie Double.parseDoubleoder Float.parseFloatstattdessen.


94
String s = "0.01";
double d = Double.parseDouble(s);
int i = (int) d;

Der Grund für die Ausnahme ist, dass eine Ganzzahl keine rationalen Zahlen enthält (= im Grunde Brüche). Der Versuch 0.3, einen Int zu analysieren , ist also Unsinn. Ein doubleoder ein floatDatentyp kann rationale Zahlen enthalten.

Die Art und Weise, wie Java a in a umwandelt double, interfolgt durch Entfernen des Teils nach dem Dezimaltrennzeichen durch Runden auf Null .

int i = (int) 0.9999;

i wird Null sein.


2
Ihre Besetzung verliert die gebrochenen Informationen vollständig. Ich bin mir nicht sicher, ob das eine gute Idee ist.
Joren

1
OK! Vielleicht muss ich so etwas machen Double d = Double.parseDouble (s); richtig?
Kevin Boyd

1
@ Kevin: Ja, aber Sie können auch "Double" anstelle von "Double" verwenden
Martijn Courteaux

1
Er sagt, er will eine ganze Zahl, aber sind wir sicher, dass er das braucht ?
Joren

29

Verwenden,

String s="0.01";
int i= new Double(s).intValue();

18
String s="0.01";
int i = Double.valueOf(s).intValue();

9

Diese Art der Konvertierung ist in Java überraschend wenig intuitiv

Nehmen Sie zum Beispiel eine folgende Zeichenfolge: "100.00"

C: eine einfache Standardbibliotheksfunktion mindestens seit 1971 ( Woher kommt der Name "atoi"? )

int i = atoi(decimalstring);

Java: obligatorische Passage durch Double (oder Float) Parse, gefolgt von einer Besetzung

int i = (int)Double.parseDouble(decimalstring);

Java hat sicher einige Kuriositäten im Ärmel


C ignoriert einfach den Rest der Zeichenfolge und analysiert alles, was analysiert werden kann (in diesem Fall ist dies der Fall 100). Sie können nicht feststellen, ob atoitatsächlich alles in der Zeichenfolge analysiert wurde oder nicht, ob die Zeichenfolge eine Zahl enthält oder ob die Zahl den Typ überschreitet. strtolist eine bessere Alternative, bei der alle oben genannten Dinge erkannt werden können. Java ist strenger, stellt jedoch sicher, dass alle diese Fälle abgedeckt sind.
nhahtdh

Ich stimme Raywell zu, weil dies funktioniert. Double.valueOf("16543").intValue();Java möchte also eine PITA sein, wenn Sie schnell in int konvertieren möchten, aber Double ist viel allgemeiner.
Jemand irgendwo

4

Verwenden von BigDecimal zum Abrunden:

String s1="0.01";
int i1 = new BigDecimal(s1).setScale(0, RoundingMode.HALF_UP).intValueExact();

String s2="0.5";
int i2 = new BigDecimal(s2).setScale(0, RoundingMode.HALF_UP).intValueExact();

3

Angenommen, wir nehmen eine Ganzzahl in Zeichenfolge.

String s = "100"; int i = Integer.parseInt (s); oder int i = Integer.valueOf (s);

In Ihrer Frage ist die Nummer, die Sie versuchen, die Änderung vorzunehmen, die ganze Nummer

String s = "10.00";

double d = Double.parseDouble (s);

int i = (int) d;

Auf diese Weise erhalten Sie die Antwort auf den Wert, den Sie erhalten möchten.



2

Verwenden Double.parseDouble(String a)Sie, wonach Sie suchen, keine Ganzzahl, da es sich nicht um eine ganze Zahl handelt.


0

Eine weitere Lösung ist möglich.

int number = Integer.parseInt(new DecimalFormat("#").format(decimalNumber))  

Beispiel:

Integer.parseInt(new DecimalFormat("#").format(Double.parseDouble("010.021")))  

Ausgabe

10
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.