web-dev-qa-db-fra.com

Conversion de chaîne en nombre décimal avec 2 décimales en Java

En Java, j'essaie d'analyser une chaîne de format "###.##" en float. La chaîne doit toujours avoir 2 décimales.

Même si la chaîne a la valeur 123.00, le float doit également être 123.00 et non 123.0.

Voici ce que j'ai jusqu'à présent:

System.out.println("string liters of petrol putting in preferences is " + stringLitersOfPetrol);

Float litersOfPetrol = Float.parseFloat(stringLitersOfPetrol);

DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);

litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

System.out.println("liters of petrol before putting in editor: " + litersOfPetrol);

Il imprime:

string liters of petrol putting in preferences is 010.00 
liters of petrol before putting in editor: 10.0
3
adityag

Cette ligne est votre problème:

litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

Là, vous avez formaté votre float en chaîne à votre guise, mais cette chaîne a ensuite été transformée de nouveau en float, puis ce que vous avez imprimé dans stdout était votre float qui avait un formatage standard. Regardez ce code

import Java.text.DecimalFormat;

String stringLitersOfPetrol = "123.00";
System.out.println("string liters of petrol putting in preferences is "+stringLitersOfPetrol);
Float litersOfPetrol=Float.parseFloat(stringLitersOfPetrol);
DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);
stringLitersOfPetrol = df.format(litersOfPetrol);
System.out.println("liters of petrol before putting in editor : "+stringLitersOfPetrol);

Et au fait, lorsque vous souhaitez utiliser des décimales, oubliez l'existence de double et float comme le suggèrent d'autres personnes et utilisez simplement l'objet BigDecimal, cela vous évitera beaucoup de maux de tête.

7
David Hofmann

Java convertir une chaîne en décimale:  

String dennis = "0.00000008880000";
double f = Double.parseDouble(dennis);
System.out.println(f);
System.out.println(String.format("%.7f", f));
System.out.println(String.format("%.9f", new BigDecimal(f)));
System.out.println(String.format("%.35f", new BigDecimal(f)));
System.out.println(String.format("%.2f", new BigDecimal(f)));

Cela imprime:

8.88E-8
0.0000001
0.000000089
0.00000008880000000000000106383001366
0.00
10
Eric Leschinski

Utilisez BigDecimal:

new BigDecimal(theInputString);

Il conserve tous les chiffres décimaux. Et vous êtes sûr de la représentation exacte car il utilise une base décimale, pas une base binaire, pour stocker la précision/échelle/etc.

Et il n'est pas sujet à une perte de précision telle que float ou double le sont, à moins que vous ne le lui demandiez explicitement.

5
fge
litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

System.out.println("liters of petrol before putting in editor : "+litersOfPetrol);

Vous imprimez Float here, qui n'a pas de format du tout.

Pour imprimer un format float, utilisez simplement

String formatted = df.format(litersOfPetrol);
System.out.println("liters of petrol before putting in editor : " + formatted);
2
GKlimov

Je veux juste être sûr que le nombre flottant aura également 2 décimales après la conversion de cette chaîne.

Vous ne pouvez pas, car les nombres à virgule flottante ne n'ont pas décimales. Ils ont binary places, qui ne correspondent pas aux décimales.

Si vous voulez des décimales, utilisez une base décimale.

2
user207421

Float.parseFloat () est le problème car il retourne un newfloat.

Retourne un nouveau float initialisé à la valeur représentée par la chaîne spécifiée, comme effectué par la méthode valueOf de la classe Float

Vous formatez uniquement à des fins d'affichage. Cela ne signifie pas que la float sera représentée par le même format en interne. 

Vous pouvez utiliser Java.lang.BigDecimal .

Je ne suis pas sûr de savoir pourquoi utilisez-vous parseFloat() deux fois. Si vous souhaitez afficher la variable float dans un certain format, formatez-la et affichez-la.

Float litersOfPetrol=Float.parseFloat(stringLitersOfPetrol);
DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);
System.out.println("liters of petrol before putting in editor"+df.format(litersOfPetrol));
1
NINCOMPOOP