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

Langage Java Discussion :

Comment faire une multiplication en JAVA (Non, je suis pas un noob :p)


Sujet :

Langage Java

  1. #1
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 583
    Points
    3 583
    Par défaut Comment faire une multiplication en JAVA (Non, je suis pas un noob :p)
    Oui, à première vue, mon titre doit vous sembler bien drôle.
    Mais voici mon problème. Je souhaite obtenir une date plusieurs jour avant une autre (sans passer par des classes type calendar, Date suffit amplement), pour avoir un intervalle. Voici donc mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    long offset = x*24*3600*1000;
    Date endDate = new Date();
    Date startDate = new Date(endDate.getTime()-offset);
    Où il suffit de remplacer x par le nombre de jours que l'on souhaite.

    Seulement, oh surprise et étonnement, quand je me rends compte que mon offset ne contient pas du tout la valeur de la multiplication. (j'ai mis 60 pour x et j'obtiens la valeur 889032704 au lieu de 5184000000 d'après la calculatrice ubuntu). Étonné, je pense donc à un dépassement, et j'essaye avec un double, rien ne change, la valeur est la même.

    Pourtant, un long a largement la capacité de contenir ce nombre, en effet, si j'affiche endDate.getTime(), j'obtiens le nombre de millisecondes depuis le 1er janvier 70 sous forme de long, autant dire nettement plus que le nombre que je cherche à obtenir...

    Alors je vous avoue que je commence à penser à un bug dans la machine virtuelle...

  2. #2
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Citation Envoyé par Flaburgan Voir le message
    Oui, à première vue, mon titre doit vous sembler bien drôle.
    Mais voici mon problème. Je souhaite obtenir une date plusieurs jour avant une autre (sans passer par des classes type calendar, Date suffit amplement), pour avoir un intervalle. Voici donc mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    long offset = x*24*3600*1000;
    Date endDate = new Date();
    Date startDate = new Date(endDate.getTime()-offset);
    Où il suffit de remplacer x par le nombre de jours que l'on souhaite.

    Seulement, oh surprise et étonnement, quand je me rends compte que mon offset ne contient pas du tout la valeur de la multiplication. (j'ai mis 60 pour x et j'obtiens la valeur 889032704 au lieu de 5184000000 d'après la calculatrice ubuntu). Étonné, je pense donc à un dépassement, et j'essaye avec un double, rien ne change, la valeur est la même.

    Pourtant, un long a largement la capacité de contenir ce nombre, en effet, si j'affiche endDate.getTime(), j'obtiens le nombre de millisecondes depuis le 1er janvier 70 sous forme de long, autant dire nettement plus que le nombre que je cherche à obtenir...

    Alors je vous avoue que je commence à penser à un bug dans la machine virtuelle...
    Comme ceci, ça devrait mieux marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    long offset = X*24l*3600l*1000l;
    Ce n'est pas un bug, juste que ton calcul était fait qu'avec des int et donc te donnait un résultat en int, d'où dépassement de capacité.

    En utilisant des long dans l'opération (en suffixant les constantes numériques avec l ou L), tu t'assures d'avoir bien un calcul fait en long.

  3. #3
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 583
    Points
    3 583
    Par défaut
    parce qu'effectivement, si je décompose le calcul sur plusieurs lignes, le résultat est juste...

    edit: en castant dès le début, ça marche. Merci beaucoup

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par Flaburgan Voir le message
    Je souhaite obtenir une date plusieurs jour avant une autre (sans passer par des classes type calendar, Date suffit amplement)
    Puis les dates atteignirent le passage à l'heure d'hiver, et ce fut le drame.

    (Sauf bien sûr, s'il est déjà spécifié qu'on utilise un repérage du temps sans système d'heure d'été.)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/02/2011, 03h01
  2. Comment faire une multiplication ?
    Par Amadeon dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/11/2009, 13h23
  3. Réponses: 4
    Dernier message: 22/07/2009, 12h52
  4. Réponses: 2
    Dernier message: 24/08/2006, 12h33
  5. Réponses: 5
    Dernier message: 24/11/2005, 00h08

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