2009-09-20 10 views

Répondre

48

0.01 n'est pas un entier (nombre entier), donc vous ne pouvez bien sûr pas l'analyser comme un seul. Utilisez Double.parseDouble ou Float.parseFloat à la place.

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

La raison de l'exception est qu'un entier ne contient pas de nombres rationnels (= essentiellement des fractions). Donc, essayer d'analyser 0.3 à un int est un non-sens. Un double ou un type de données float peut contenir des nombres rationnels.

La façon dont Java jette un double à un int se fait par enlever la partie après le séparateur décimal en arrondi vers zéro.

int i = (int) 0.9999; 

i sera par zéro.

+2

Votre distribution perdra complètement les informations fractionnaires. Je ne suis pas sûr que ce soit une bonne idée de conseiller. – Joren

+1

Ok! peut-être que je devrai faire quelque chose comme ça Double d = Double.parseDouble (s); droite? –

+1

@Joren: Je sais, mais il veut un nombre entier (si je vérifie son code) –

2

Utilisez Double.parseDouble(String a) ce que vous recherchez n'est pas un nombre entier car ce n'est pas un nombre entier.

18

Utilisation,

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

utiliser celui-ci

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

7

Ce type de conversion est en fait suprisingly unintuitive en Java

Prenez par exemple une chaîne de caractères suivante: " 100.00 "

C: une simple fonction de bibliothèque standard au moins depuis 1971 (Where did the name `atoi` come from?)

int i = atoi(decimalstring); 

Java: passage obligatoire par double (ou flotteur) analyser, suivie par un casting

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

Java a certainement des bizarreries dans sa manche

+0

C ignore simplement le reste de la chaîne, et analyse tout ce qu'elle peut analyser (dans ce cas, c'est '100').Il n'y a aucun moyen pour vous de savoir si 'atoi' a réellement analysé tout dans la chaîne ou non, si la chaîne contient un nombre ou si le nombre déborde le type. 'strtol' est une meilleure alternative où toutes les choses ci-dessus peuvent être détectées. Java est plus strict, mais il s'assure que tous ces cas sont couverts. – nhahtdh

+0

Je suis d'accord avec Raywell parce que cela fonctionne 'Double.valueOf (" 16543 "). IntValue();' Donc Java veut être un PITA quand vous voulez convertir rapidement en int, et pourtant Double est beaucoup plus général. –

2

Utilisation de BigDecimal pour arrondir:

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(); 
Questions connexes