rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

[Java] Addition, opération

kij_82, le jeudi 25 janvier 2007 à 14:27:49
Bonjour,

Je m'adresse à vous pour avoir des informations sur les différents opérateurs mathématiques en JAVA.
J'ai du faire des calculs pour réveiller des threads et comparer des dates d'une base de donnée par rapport à la date courant pour migrer des requètes d'une base à une autre... globalement c'est le contexte de mon problème.

Le problème vient en fait je pense de ma facon de faire pour additionner / multiplier des nombres entre eux.

Voici un bout de code qui retire normalement 30 jours à la date courante, le premier affiche correctement :
long toto = (long) 30*(24*3600*1000);

long myDateLimitInMillis = System.currentTimeMillis()-toto;
System.out.println("Temps avant : "+System.currentTimeMillis());

System.out.println("Temps a enlever : "+toto);

System.out.println("Temps apres : "+myDateLimitInMillis);


java.sql.Timestamp myTS = new java.sql.Timestamp(myDateLimitInMillis);
java.sql.Timestamp today = new java.sql.Timestamp(System.currentTimeMillis());
System.out.println(myTS.toString());                       
System.out.println("Today = "+today.toString());


Seulement au départ j'avais la même chose mais sans caster mon premier calcul :
long toto = 30*(24*3600*1000);

long myDateLimitInMillis = System.currentTimeMillis()-toto;
System.out.println("Temps avant : "+System.currentTimeMillis());

System.out.println("Temps a enlever : "+toto);

System.out.println("Temps apres : "+myDateLimitInMillis);


java.sql.Timestamp myTS = new java.sql.Timestamp(myDateLimitInMillis);
java.sql.Timestamp today = new java.sql.Timestamp(System.currentTimeMillis());
System.out.println(myTS.toString());                       
System.out.println("Today = "+today.toString());


Je demande donc à ceux qui le peuvent d'exécuter ces deux bout de code java afin qu'ils puissent voir d'eux même que dans ce deuxieme code, la variable toto contient parfois un nomvre négatif, parfois pas, selon que l'on varie le calcul...

Je voulais comprendre d'ou cela pouvait venir, je pensais au fait que le chiffre obtenu apres calcul était un nombre avec un bit signé devant, ce qui faisait apparaitre un signe - au niveau du texte et qui était donc mal inteprété, mais je n'en suis pas sur...

De même, j'ai résolu mon probleme en castant le résultat (premier code), mais connaitriez vous une autre méthode pour effectuer ce même calcul, à savoir, retirer 30 jours de la date courante.

Merci de votre patience :)


~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~
Configuration: Windows XP
Internet Explorer 7.0
Répondre à kij_82  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kij_82, le jeudi 25 janvier 2007 à 14:46:49
En fait c'est bon j'ai trouvé une autre facon de faire sans bidouiller :)

Voici le truc :

int num = 30;

java.util.Calendar myCal = java.util.Calendar.getInstance();
java.sql.Timestamp myTS = new java.sql.Timestamp(myCal.getTimeInMillis());
System.out.println("Date courante : "+myTS.toString());
myCal.add(java.util.Calendar.DATE,(-1) * num);
myTS = new java.sql.Timestamp(myCal.getTimeInMillis());
System.out.println("Date calculée : "+myTS.toString());
myCal.getTimeInMillis()


Merci. ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~
Répondre à kij_82

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 Osamoelle, le vendredi 6 juin 2008 à 11:13:52
Quand tu fais 30*(24*3600*1000); tu réalises ton calcul avec une précision max d'un Integer qui est assez limité pour un calcul de cette taille.
Par défaut, java fait ses calculs en int.
Si tu mets 30.0*(24.0*3600.0*1000.0), il le fera en double.
Si tu mets 30L*(24L*3600L*1000L), il comprendra que chaque nombre est un long
Si tu mets 30f*(24f*3600f*1000f), il comprendra que chaque nombre est un float

Cela a une importance car en info, un nombre selon son type va être codé sur 8, 16, 32 ou 64 bits. On comprend vite alors qu'un entier en 32 bits et qui plus est signé représente un ensemble fini de valeur pouvant être représenté. Je t'invite à regarder la classe Integer et les valeurs de MAX et MIN.
Quand il y a un dépassement des valeurs limites, y'a un overflow, un peu comme si tu depassais sur ta voiture le kilometrage 999 999km, tu reviendrais à 000000, puis 0000001, etc...

Réponse un peu tard, mais je viens de tomber par hasard sur ton post.
Répondre à Osamoelle
Logiciels pertinents trouvés dans les téléchargements
Télécharger Opera 9.52Opera - Marre des trous de sécurité du navigateur par défaut ? Envie enfin d'avoir un navigateur simple et configurable facilement ?...Catégorie: Navigateurs
Licence: Freeware/gratuit
Télécharger Java Runtime Environment 6 Update 7Java Runtime Environment - Java Runtime Environment (JRE) installe la machine virtuelle Java, permettant de jouer en ligne, de discuter avec des...Catégorie: Java
Licence: Open Source
Télécharger Java Tools 0.35Java Tools - Java Tools est un IDE très léger pour la création, la compilation, l'exécution et le débogage des applications Java et des...Catégorie: Java
Licence: Freeware/gratuit
Télécharger OperaUSB 9.52OperaUSB - Le célèbre navigateur Opéra est enfin disponible en version USB. OperaUSB est la version portative du célèbre navigateur...Catégorie: Navigateurs
Licence: Freeware/gratuit
Plus de logiciels gratuits sur « [Java] Addition, opération »