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?

Kevin Boyd
quelle

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.

Joren
quelle
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.

Martijn Courteaux
quelle
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();
Adatapost
quelle
18
String s="0.01";
int i = Double.valueOf(s).intValue();
Swapnil
quelle
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

Raywell
quelle
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();
AnnTea
quelle
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.

ayushs27
quelle
2

verwende das hier

int number = (int) Double.parseDouble(s);

Kevin Tan
quelle
2

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

dominant
quelle
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
Prabs
quelle