Rechercher : dans
Par :

[Java] Addition, opération

Dernière réponse le 6 jun 2008 à 11:13:52 kij_82, le 25 jan 2007 à 14:27:49 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [Java] Addition, opération » dans :
Javascript: les opérateurs Voir Qu'est-ce qu'un opérateur? Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, ... On distingue plusieurs types d'opérateurs : les opérateurs de calcul les opérateurs...
VirtualBox - Installer les additions client dans Ubuntu VoirUne fois le système d'exploitation installé dans VirtualBox, il est recommandé d'installer les additions client. Ce sont des pilotes à installer dans la machine virtuelle qui améliorent le fonctionnement : affichage graphique plus rapide ; ...
Installer Java sous Ubuntu VoirPar défaut, Firefox n'est pas fourni avec Java. Voici comment procéder pour l'installer: Ouvrez un terminal (Menu Applications > Accessoires > Terminal) et tapez: sudo aptitude install sun-java6-jre sun-java6-plugin ou sudo aptitude install ...
[Firefox] plugin Java Jre de Sun VoirA) Les différentes variantes Java chez Sun B) Installation sous Mandriva Limited Edition 2005 ETAPE 1 ETAPE 2: Création du lien symbolique C) Installation sous debian lenny D) Installation sous ubuntu hardy heron A) Les différentes...
Télécharger Opera VoirMarre des trous de sécurité du navigateur par défaut ? Envie enfin d'avoir un navigateur simple et configurable facilement ? Opera est un navigateur gratuit possédant des fonctionnalités avancées : Sessions - Enregistrez un ensemble d'onglets...
Télécharger Java Runtime Environment VoirJava Runtime Environment (JRE) installe la machine virtuelle Java, permettant de jouer en ligne, de discuter avec des personnes dans le monde entier, de calculer les intérêts de votre prêt immobilier ou de visualiser des images en 3D. Ces...
Java: les opérateurs VoirQu'est-ce qu'un opérateur? Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, ... On distingue plusieurs types d'opérateurs : les opérateurs de calcul les...
Java: Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditonnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
PHP - Les opérateurs VoirQu'est-ce qu'un opérateur? Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, ... On distingue plusieurs types d'opérateurs : les opérateurs de calcul les opérateurs...

1

kij_82, le 25 jan 2007 à 14:46:49
  • +2

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

 Osamoelle, le 6 jun 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