J'ai ceci,
import java.util.Scanner; public class StringDecimalPartLength { public static void main(String[] args){ Scanner input = new Scanner(System.in); System.out.print("Enter a decimal number: "); Double string_Temp = Double.parseDouble(input.nextLine().replace(',', '.')); String string_temp = Double.toString(string_Temp); String[] result = string_temp.split("\\."); System.out.print(result[1].length() + " decimal place(s)"); } }
cela fonctionne jusqu'à ce que j'entre un nombre avec zéro à la fin, comme 4,90. Il ignore le zéro et renvoie 1.
Comment résoudre ce problème? Merci!
3 Réponses :
Puisque vous lisez déjà l'entrée sous forme de chaîne, vous pouvez enregistrer cette valeur, puis tester pour voir s'il s'agit d'un nombre décimal valide:
import java.util.Scanner; public class StringDecimalPartLength { public static void main(String[] args){ Scanner input = new Scanner(System.in); System.out.print("Enter a decimal number: "); String value = input.nextLine().replace(',', '.'); try { Double.parseDouble(value); String[] result = value.split("\\."); System.out.print(result[1].length() + " decimal place(s)"); } catch (NumberFormatException e) { System.out.println("The entered value is not a decimal number."); } } }
merci Omari, cela a fonctionné, mais il n'a pas attrapé toutes les erreurs. J'ai dû l'ajuster et cela a fonctionné.
quand quelque chose comme 1. a été entré, il n'a pas attrapé l'exception, maintenant il le fait
@RoiboisTx Ce serait parce qu'en analysant la valeur 1
peut être convertie en un nombre décimal puisqu'elle équivaut à 1.0
.
4.9 ou 4.90 en tant que double
sont tous deux représentés par la même approximation. Il n'y a aucune différence entre eux.
Vous pouvez, bien entendu, faire ce que vous voulez en utilisant le traitement String sur l'entrée. Cependant, vous pouvez trouver BigDecimal
un meilleur type de données pour ce que vous faites. Il fait la distinction entre 4,9 et 4,90, et peut représenter chacun d'eux exactement.
4.9000000000000003552713678800500929355621337890625 4.9000000000000003552713678800500929355621337890625 4.9 1 4.90 2
Résultat:
import java.math.BigDecimal; public class Test { public static void main(String[] args) { System.out.println(new BigDecimal(4.9)); System.out.println(new BigDecimal(4.90)); BigDecimal x1 = new BigDecimal("4.9"); System.out.println(x1); System.out.println(x1.scale()); BigDecimal x2 = new BigDecimal("4.90"); System.out.println(x2); System.out.println(x2.scale()); } }
Je vais examiner cette approche, l'apprécier.
Omari, j'ai ajusté votre code comme ça et ça a marché, merci!
if (result [0] .length () == 0) {
System.out.print("The entered value is not a decimal number."); } else { System.out.print(result[1].length() + " decimal place(s)"); } } catch (NumberFormatException e) { System.out.println("The entered value is not a decimal number."); }catch (ArrayIndexOutOfBoundsException e) { System.out.print("Error Message" ); }
p >
Avez-vous calculé la longueur avant de la convertir en double? Si vous convertissez
"4.90"
en double, vous obtenez4.9
. Ensuite, si vous reconvertissez en chaîne, vous obtenez"4.9"
.merci les gars, je comprends maintenant la logique derrière tout ça