OVH Cloud OVH Cloud

double to int : Erreur

2 réponses
Avatar
Johan Coffigniez
Bonjour,
Je débute en csharp et je bloque sur les formats int double ...

J'essaie de récupérer l'age de quelqu'un en faisant l'opération entre la
date qu'il indique dans le calendrier et la date actuelle.

nbJour = DateTime.Now - monthCalendar1.SelectionRange.Start;
double Jrs = nbJour.TotalDays / 365.25;

J'obtiens une réponse à rallonge du type: Jrs = 15,0002333555

Je n'arrive pas a avoir une réponse simpe du type int comme 15


Merci d'avance

johan

2 réponses

Avatar
Bruno Jouhier [MVP]
"LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> a écrit dans le message de
news:
Essaye un :

int Jrs = Convert.ToInt32(nbJour.TotalDays / 365.25);

sinon, une solution moins propres serait de rechercher la virgule, dans
ton
nombre, et d'extraire la chaine allant du départ jusqu'a la position de la
virgue - 1



Ca ne donne pas le même résultat. Ca tronque au lieu d'arrondir.
Si on part de 3.6, Convert.ToInt32 donne 4 alors qu'on obtient 3 en
tronquant.

Il y a un moyen plus rapide de tronquer: le cast:
(int)3.6 --> 3

Enfin, dernier conseil avec les doubles: il est très difficile de contrôler
leur représentation en décimales, il faut systématiquement faire un arrondi
si on veut éviter d'obtenir des 3,599999......7 ou des 3,6000...003 en fin
de calcul. Pour éviter ça, il y a le type decimal qui contrairement à double
est capable de représenter **exactement** les nombres décimaux dans une
plage de valeur et précision suffisante pour la plupart des applications (le
type double n'a pas de représentation exacte d'un nombre aussi simple que
0.1, il représente exactement les fractions binaires mais pas la plupart des
fractions décimales!)

Bruno.


A+

-------------------
LEBRUN Thomas
http://morpheus.developpez.com


"Johan Coffigniez" wrote:

Bonjour,
Je débute en csharp et je bloque sur les formats int double ...

J'essaie de récupérer l'age de quelqu'un en faisant l'opération entre la
date qu'il indique dans le calendrier et la date actuelle.

nbJour = DateTime.Now - monthCalendar1.SelectionRange.Start;
double Jrs = nbJour.TotalDays / 365.25;

J'obtiens une réponse à rallonge du type: Jrs = 15,0002333555

Je n'arrive pas a avoir une réponse simpe du type int comme 15


Merci d'avance

johan







Avatar
Johan
Oui en effet, je viens de m'apercevoir du tronquage. Je suis plus vieux d'1
an , dés les 6 premiers mois de l'année sont passés. Sur que cela pourrait
vexer certaines personnes ;)

nbJour = DateTime.Now - monthCalendar1.SelectionRange.Start;
double Jrs = nbJour.TotalDays / 365.25;
Jrs = (int)Jrs;

Merci voila une soirée productive en enseignement !
Thx

Johan

"Bruno Jouhier [MVP]" wrote:

"LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> a écrit dans le message de
news:
> Essaye un :
>
> int Jrs = Convert.ToInt32(nbJour.TotalDays / 365.25);
>
> sinon, une solution moins propres serait de rechercher la virgule, dans
> ton
> nombre, et d'extraire la chaine allant du départ jusqu'a la position de la
> virgue - 1

Ca ne donne pas le même résultat. Ca tronque au lieu d'arrondir.
Si on part de 3.6, Convert.ToInt32 donne 4 alors qu'on obtient 3 en
tronquant.

Il y a un moyen plus rapide de tronquer: le cast:
(int)3.6 --> 3

Enfin, dernier conseil avec les doubles: il est très difficile de contrôler
leur représentation en décimales, il faut systématiquement faire un arrondi
si on veut éviter d'obtenir des 3,599999......7 ou des 3,6000...003 en fin
de calcul. Pour éviter ça, il y a le type decimal qui contrairement à double
est capable de représenter **exactement** les nombres décimaux dans une
plage de valeur et précision suffisante pour la plupart des applications (le
type double n'a pas de représentation exacte d'un nombre aussi simple que
0.1, il représente exactement les fractions binaires mais pas la plupart des
fractions décimales!)

Bruno.

>
> A+
>
> -------------------
> LEBRUN Thomas
> http://morpheus.developpez.com
>
>
> "Johan Coffigniez" wrote:
>
>> Bonjour,
>> Je débute en csharp et je bloque sur les formats int double ...
>>
>> J'essaie de récupérer l'age de quelqu'un en faisant l'opération entre la
>> date qu'il indique dans le calendrier et la date actuelle.
>>
>> nbJour = DateTime.Now - monthCalendar1.SelectionRange.Start;
>> double Jrs = nbJour.TotalDays / 365.25;
>>
>> J'obtiens une réponse à rallonge du type: Jrs = 15,0002333555
>>
>> Je n'arrive pas a avoir une réponse simpe du type int comme 15
>>
>>
>> Merci d'avance
>>
>> johan
>>
>>
>>