IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Appliquer arrondit 2 chiffres après la virgule, sur un calcul à partir d'objets


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de BBornier
    Homme Profil pro
    Etudiant en dev Java
    Inscrit en
    Mars 2021
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant en dev Java

    Informations forums :
    Inscription : Mars 2021
    Messages : 15
    Par défaut Appliquer arrondit 2 chiffres après la virgule, sur un calcul à partir d'objets
    Bonjour à tous,
    j'ai un soucis un peu particulier en ce sens où je n'ai pas trouvé de solutions à mes recherches.

    Je dois calculer un prix d'une place de stationnement fonction d'une durée et du prix à l'heure de la palce de parking. Au résultat, j'ai ceci : "Please pay the parking fare:1.50000375". Ce que je souhaite faire c'est avoir 2 chiffres seulement après la virgules.
    Là où est mon problème c'est que la méthode de calcul se fait via un setter/getter et des objets. Ci dessous mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    package com.parkit.parkingsystem.service;import java.text.DecimalFormat;
    import com.parkit.parkingsystem.constants.Fare;
    import com.parkit.parkingsystem.model.Ticket;
     
     
    public class FareCalculatorService {
     
        public void calculateFare(Ticket ticket) {
     
               long duration = calculateTicketParkTime(ticket.getOutTime().getTime(), ticket.getInTime().getTime());    
     
               switch (ticket.getParkingSpot().getParkingType()){ // Attribue un type de place de parking (voiture ou vélo)
                case CAR: { // Dans le cas d'une voiture qui se gare
                	//Prend la durée de stationnement, multiplie par le prix du stationnement à l'heure (ici 1.5),
                	//puis la durée en millisecondes est convertit en minutes pour avoir le bon résultat.
                    ticket.setPrice((duration * Fare.CAR_RATE_PER_HOUR)/(60*60*1000)); 
                    break;
                }
                case BIKE: { // Dans le cas d'un vélo qui se gare
                    ticket.setPrice((duration * Fare.BIKE_RATE_PER_HOUR)/(60*60*1000));               
                    break;
                }
                default: throw new IllegalArgumentException("Unkown Parking Type");
     
     
            }
        }
        public long calculateTicketParkTime(long outHour, long inHour) {
     
        	// réadaptation du if de départ.
    		if( (outHour == 0) || (outHour < inHour) ) {
                throw new IllegalArgumentException("Out time provided is incorrect:"+outHour);
            }
        	long duration = outHour - inHour;
    		return duration;
    J'aimerais stocker le résulat de ticket.setPrice((duration * Fare.CAR_RATE_PER_HOUR)/(60*60*1000)); par exemple et utiliser une méthode type DecimalFormat pour que j'obtienne juste 2 chiffres après la décimale. Mais je ne vois pas comment faire.
    Je pourrais créer une méthode que je pourrai appeler dans mon switch mais là aussi je suis coincé..

    Une idée ?
    En vous remerciant

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    le code semble indiquer que le prix est stocké dans une variable de type float ou double.

    Le problème de ces type, c'est qu'ils ne peuvent pas stocker de nombre avec deux chiffres après la virgule. Ils ne calculent que des approchés.
    (La raison en est que quand on dit "deux chiffres après la virgule" on veut dire en notation humaine, écrits avec 10 chiffres. Or les ordinateurs utilisent le binaire.)

    Pour stocker un prix en centimes, de sorte que ce soit une valeur exacte, il faudrait donc utiliser autre chose.

    Plusieurs possibilités :

    - Une String, donc oui, à l'aide d'un DecimalFormat
    - Un BigDecimal, qu'on arrondit aux centièmes
    - Un int ou un long, qui contient le prix en centimes. Penser à convertir en euros avant l'affichage, du coup il faudra quand même passer par String ou BigDecimal quand on veut afficher.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti Avatar de BBornier
    Homme Profil pro
    Etudiant en dev Java
    Inscrit en
    Mars 2021
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant en dev Java

    Informations forums :
    Inscription : Mars 2021
    Messages : 15
    Par défaut
    Hello thelvin,

    Merci pour ta réponse ! donc je suis pas trop mal et sur la bonne voie.
    Le prix est effectivement un double :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public double getPrice() {
            return price;
        }
     
        public void setPrice(double price) {
            this.price = price;
        }
    Le problème quand je souhaite utiliser DecimalFormat :
    Dois-je utiliser la méthode de la manière suivante ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    switch (ticket.getParkingSpot().getParkingType()){ 
                case CAR: { 
                    double price = ticket.setPrice((duration * Fare.CAR_RATE_PER_HOUR)/(60*60*1000)); 
                    DecimalFormat df = new DecimalFormat("#.##");
                	df.format(price);
                    break;
    Il m'envoie un peu dans les pâquerettes..

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hum, comme dit au-dessus, un double ne peut pas contenir un nombre "à deux virgules", donc le prix ne peut pas être un double. Il faut choisir une des trois options.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti Avatar de BBornier
    Homme Profil pro
    Etudiant en dev Java
    Inscrit en
    Mars 2021
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant en dev Java

    Informations forums :
    Inscription : Mars 2021
    Messages : 15
    Par défaut
    Ok, je pensais que je pouvais d'abord déclarer mon price double puis le convertir grâce à la méthode DecimalFormat().

    Mais du coup comment stocker le résultat du calcul (duration * Fare.CAR_RATE_PER_HOUR)/(60*60*1000)) ? pour pouvoir ensuite l'utiliser avec DecimalFormat() ? Car cette méthode n'accepte pas le type de paramètres du calcul inclus dans le setter setPrice().

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Avec une variable.

    Pardon j'avais oublié qu'on est dans la section débuter.

    On peut faire les choses de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double theory = computeTheoreticalPrice();
     
    String rounded = roundPrice(theory);
     
    object.setPrice(rounded);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. arrondir un nombre à 2 chiffres après la virgule
    Par El Saigneur dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/02/2005, 08h36
  2. Commande pour afficher des chiffres apres la virgule
    Par manar dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/09/2004, 18h28
  3. Chiffres après la virgule figés
    Par bondjames dans le forum Bases de données
    Réponses: 6
    Dernier message: 10/03/2004, 23h09
  4. [MFC] Nombre de chiffres après la virgule
    Par karl3i dans le forum MFC
    Réponses: 3
    Dernier message: 27/01/2004, 13h04
  5. Nb de chiffres après la virgule ?
    Par Thcan dans le forum C
    Réponses: 10
    Dernier message: 17/09/2003, 21h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo