3
votes

Compter les chiffres après la virgule, y compris le dernier zéro

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!


2 commentaires

Avez-vous calculé la longueur avant de la convertir en double? Si vous convertissez "4.90" en double, vous obtenez 4.9 . Ensuite, si vous reconvertissez en chaîne, vous obtenez "4.9" .


merci les gars, je comprends maintenant la logique derrière tout ça


3 Réponses :


1
votes

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.");
        }
    }
}


3 commentaires

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 .



0
votes

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());
  }
}


1 commentaires

Je vais examiner cette approche, l'apprécier.



0
votes

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 >


0 commentaires