[Java] Addition, opération

Résolu/Fermé
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 25 janv. 2007 à 14:27
 Osamoelle - 6 juin 2008 à 11:13
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 :)


A voir également:

2 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 janv. 2007 à 14:46
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.
1
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.
0