int ConversionEnCentimes (double euros)
{
return (euros * 100) + 0.5;
}
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par la
norme que les valeurs sont tronqués lorsqu'elles sont stockées ? Par
exemple, que 17.58 mis dans un double sera égal ou plus petit ? Je
ne crois pas (et je me demande si c'est ce que tu veux dire par
« dépend du mode d'arrondie »). Si la valeur peut être plus grande,
ce que je crois, alors le +0.5 fera passé à la prochaine unité, ce
qui est incorrect.
int ConversionEnCentimes (double euros)
{
return (euros * 100) + 0.5;
}
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par la
norme que les valeurs sont tronqués lorsqu'elles sont stockées ? Par
exemple, que 17.58 mis dans un double sera égal ou plus petit ? Je
ne crois pas (et je me demande si c'est ce que tu veux dire par
« dépend du mode d'arrondie »). Si la valeur peut être plus grande,
ce que je crois, alors le +0.5 fera passé à la prochaine unité, ce
qui est incorrect.
int ConversionEnCentimes (double euros)
{
return (euros * 100) + 0.5;
}
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par la
norme que les valeurs sont tronqués lorsqu'elles sont stockées ? Par
exemple, que 17.58 mis dans un double sera égal ou plus petit ? Je
ne crois pas (et je me demande si c'est ce que tu veux dire par
« dépend du mode d'arrondie »). Si la valeur peut être plus grande,
ce que je crois, alors le +0.5 fera passé à la prochaine unité, ce
qui est incorrect.
int ConversionEnCentimes (double euros)
{
return (euros * 100) + 0.5;
}
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par la
norme que les valeurs sont tronqués lorsqu'elles sont stockées ?
Si epsilon est plus petit que 0.005 (strictement), alors la partie
entiere de euros*100+0.5 est bien 1758
int ConversionEnCentimes (double euros)
{
return (euros * 100) + 0.5;
}
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par la
norme que les valeurs sont tronqués lorsqu'elles sont stockées ?
Si epsilon est plus petit que 0.005 (strictement), alors la partie
entiere de euros*100+0.5 est bien 1758
int ConversionEnCentimes (double euros)
{
return (euros * 100) + 0.5;
}
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par la
norme que les valeurs sont tronqués lorsqu'elles sont stockées ?
Si epsilon est plus petit que 0.005 (strictement), alors la partie
entiere de euros*100+0.5 est bien 1758
Avec 1758, tout à fait. Je pensais à des cas comme 17.585 qu'on
voudrait arrondir à 1759, alors qu'on voudrait 17.584999 à 1758.
Dans ce cas, je continue à penser que ce n'est pas si simple...
Mais ce n'était pas le problème posé originalement.
Par ailleurs, pour avoir 1758 à partir de 17.58, on aurait tout
aussi bien pu additionner 0.9 ou 0.1; c'est ce 0.5 qui m'avait
perturbé :-).
Avec 1758, tout à fait. Je pensais à des cas comme 17.585 qu'on
voudrait arrondir à 1759, alors qu'on voudrait 17.584999 à 1758.
Dans ce cas, je continue à penser que ce n'est pas si simple...
Mais ce n'était pas le problème posé originalement.
Par ailleurs, pour avoir 1758 à partir de 17.58, on aurait tout
aussi bien pu additionner 0.9 ou 0.1; c'est ce 0.5 qui m'avait
perturbé :-).
Avec 1758, tout à fait. Je pensais à des cas comme 17.585 qu'on
voudrait arrondir à 1759, alors qu'on voudrait 17.584999 à 1758.
Dans ce cas, je continue à penser que ce n'est pas si simple...
Mais ce n'était pas le problème posé originalement.
Par ailleurs, pour avoir 1758 à partir de 17.58, on aurait tout
aussi bien pu additionner 0.9 ou 0.1; c'est ce 0.5 qui m'avait
perturbé :-).
Dans le message
,
Fabien LE LEZ wrote:int ConversionEnCentimes (double euros)
{
return (euros * 100) + 0.5;
}
Fait gaffe quand même. Le résultat dans certains cas dépend
de la mode d'arrondie (même si ça doit marcher dans ce cas
précis).
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par
la norme que les valeurs sont tronqués lorsqu'elles sont
stockées ? Par exemple, que 17.58 mis dans un double sera égal
ou plus petit ?
Je ne crois pas (et je me demande si c'est ce que tu veux dire
par « dépend du mode d'arrondie »).
Si la valeur peut être plus grande, ce que je crois, alors le
+0.5 fera passé à la prochaine unité, ce qui est incorrect. Je
ne crois pas que la solution soit aussi simple, du moment où,
une fois stockée, on ne peut pas savoir quelle était vraiment
la valeur initialement obtenue...
Dans le message
1111054093.266010.122450@z14g2000cwz.googlegroups.com,
Fabien LE LEZ wrote:
int ConversionEnCentimes (double euros)
{
return (euros * 100) + 0.5;
}
Fait gaffe quand même. Le résultat dans certains cas dépend
de la mode d'arrondie (même si ça doit marcher dans ce cas
précis).
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par
la norme que les valeurs sont tronqués lorsqu'elles sont
stockées ? Par exemple, que 17.58 mis dans un double sera égal
ou plus petit ?
Je ne crois pas (et je me demande si c'est ce que tu veux dire
par « dépend du mode d'arrondie »).
Si la valeur peut être plus grande, ce que je crois, alors le
+0.5 fera passé à la prochaine unité, ce qui est incorrect. Je
ne crois pas que la solution soit aussi simple, du moment où,
une fois stockée, on ne peut pas savoir quelle était vraiment
la valeur initialement obtenue...
Dans le message
,
Fabien LE LEZ wrote:int ConversionEnCentimes (double euros)
{
return (euros * 100) + 0.5;
}
Fait gaffe quand même. Le résultat dans certains cas dépend
de la mode d'arrondie (même si ça doit marcher dans ce cas
précis).
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par
la norme que les valeurs sont tronqués lorsqu'elles sont
stockées ? Par exemple, que 17.58 mis dans un double sera égal
ou plus petit ?
Je ne crois pas (et je me demande si c'est ce que tu veux dire
par « dépend du mode d'arrondie »).
Si la valeur peut être plus grande, ce que je crois, alors le
+0.5 fera passé à la prochaine unité, ce qui est incorrect. Je
ne crois pas que la solution soit aussi simple, du moment où,
une fois stockée, on ne peut pas savoir quelle était vraiment
la valeur initialement obtenue...
Marc Boyer wrote:Comme tu le dis, tant qu'on reste dans les euros, on garde
2 décimales (3 pour vendre de l'essence).
... et pour les factures de France Telecom. Puis, pour les
factures EDF, il faut 4 décimales.
Marc Boyer wrote:
Comme tu le dis, tant qu'on reste dans les euros, on garde
2 décimales (3 pour vendre de l'essence).
... et pour les factures de France Telecom. Puis, pour les
factures EDF, il faut 4 décimales.
Marc Boyer wrote:Comme tu le dis, tant qu'on reste dans les euros, on garde
2 décimales (3 pour vendre de l'essence).
... et pour les factures de France Telecom. Puis, pour les
factures EDF, il faut 4 décimales.
Michel Michaud wrote:Dans le message
,
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par
la norme que les valeurs sont tronqués lorsqu'elles sont
stockées ? Par exemple, que 17.58 mis dans un double sera égal
ou plus petit ?
§4.9/1 : « An rvalue of a floating point type can be converted
to an rvalue of an integer type. The conversion truncates; that
is, the fractional part is discarded. »
Michel Michaud wrote:
Dans le message
1111054093.266010.122450@z14g2000cwz.googlegroups.com,
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par
la norme que les valeurs sont tronqués lorsqu'elles sont
stockées ? Par exemple, que 17.58 mis dans un double sera égal
ou plus petit ?
§4.9/1 : « An rvalue of a floating point type can be converted
to an rvalue of an integer type. The conversion truncates; that
is, the fractional part is discarded. »
Michel Michaud wrote:Dans le message
,
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par
la norme que les valeurs sont tronqués lorsqu'elles sont
stockées ? Par exemple, que 17.58 mis dans un double sera égal
ou plus petit ?
§4.9/1 : « An rvalue of a floating point type can be converted
to an rvalue of an integer type. The conversion truncates; that
is, the fractional part is discarded. »
Dans le message
,
Michel Michaud wrote:
Dans le message
,
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par
la norme que les valeurs sont tronqués lorsqu'elles sont
stockées ? Par exemple, que 17.58 mis dans un double sera égal
Tu as manqué la partie « mis dans un double »...
ou plus petit ?
§4.9/1 : « An rvalue of a floating point type can be
converted to an rvalue of an integer type. The conversion
truncates; that is, the fractional part is discarded. »
Je ne parlais pas de la troncation en entier, mais de l'erreur
de représentation dès que la valeur est mise dans le double
(17.58 dans un double sera-t-il nécessairement plus petit que
17.58, par exemple 17.5799999999999875 ou pourrait-il être
plus grand, par exemple pourrait-il devenir
17.5800000000000125.)
Dans le message
1111134629.607148.184180@o13g2000cwo.googlegroups.com,
Michel Michaud wrote:
Dans le message
1111054093.266010.122450@z14g2000cwz.googlegroups.com,
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par
la norme que les valeurs sont tronqués lorsqu'elles sont
stockées ? Par exemple, que 17.58 mis dans un double sera égal
Tu as manqué la partie « mis dans un double »...
ou plus petit ?
§4.9/1 : « An rvalue of a floating point type can be
converted to an rvalue of an integer type. The conversion
truncates; that is, the fractional part is discarded. »
Je ne parlais pas de la troncation en entier, mais de l'erreur
de représentation dès que la valeur est mise dans le double
(17.58 dans un double sera-t-il nécessairement plus petit que
17.58, par exemple 17.5799999999999875 ou pourrait-il être
plus grand, par exemple pourrait-il devenir
17.5800000000000125.)
Dans le message
,
Michel Michaud wrote:
Dans le message
,
Ça « doit » marcher ? Vraiment ? Est-ce que c'est garanti par
la norme que les valeurs sont tronqués lorsqu'elles sont
stockées ? Par exemple, que 17.58 mis dans un double sera égal
Tu as manqué la partie « mis dans un double »...
ou plus petit ?
§4.9/1 : « An rvalue of a floating point type can be
converted to an rvalue of an integer type. The conversion
truncates; that is, the fractional part is discarded. »
Je ne parlais pas de la troncation en entier, mais de l'erreur
de représentation dès que la valeur est mise dans le double
(17.58 dans un double sera-t-il nécessairement plus petit que
17.58, par exemple 17.5799999999999875 ou pourrait-il être
plus grand, par exemple pourrait-il devenir
17.5800000000000125.)
Je ne parlais pas de la troncation en entier, mais de l'erreur
de représentation dès que la valeur est mise dans le double
(17.58 dans un double sera-t-il nécessairement plus petit que
17.58, par exemple 17.5799999999999875 ou pourrait-il être
plus grand, par exemple pourrait-il devenir
17.5800000000000125.)
Je ne comprends pas ce que tu veux dire. La valeur 17.58 ne
serait jamais mis dans un double.
si le type cible est flottant, la
direction de l'arrondie dépend de l'implémentation
Alors, quelle est ta question exactement ?
Je ne parlais pas de la troncation en entier, mais de l'erreur
de représentation dès que la valeur est mise dans le double
(17.58 dans un double sera-t-il nécessairement plus petit que
17.58, par exemple 17.5799999999999875 ou pourrait-il être
plus grand, par exemple pourrait-il devenir
17.5800000000000125.)
Je ne comprends pas ce que tu veux dire. La valeur 17.58 ne
serait jamais mis dans un double.
si le type cible est flottant, la
direction de l'arrondie dépend de l'implémentation
Alors, quelle est ta question exactement ?
Je ne parlais pas de la troncation en entier, mais de l'erreur
de représentation dès que la valeur est mise dans le double
(17.58 dans un double sera-t-il nécessairement plus petit que
17.58, par exemple 17.5799999999999875 ou pourrait-il être
plus grand, par exemple pourrait-il devenir
17.5800000000000125.)
Je ne comprends pas ce que tu veux dire. La valeur 17.58 ne
serait jamais mis dans un double.
si le type cible est flottant, la
direction de l'arrondie dépend de l'implémentation
Alors, quelle est ta question exactement ?
Je voulais seulement dire qu'il ne suffit pas d'ajouter .5 après
avoir multiplié par une puissance de 10 pour récupérer une valeur
qu'on pense avoir stockée, avec une certaine précision (en entier
ou autre). Mais le message original parlait de récupérer seulement
deux décimales, ce qui est possible bien entendu (mais il n'est
pas nécessaire d'utiliser 0.5 alors... voir les autres messages).
Je voulais seulement dire qu'il ne suffit pas d'ajouter .5 après
avoir multiplié par une puissance de 10 pour récupérer une valeur
qu'on pense avoir stockée, avec une certaine précision (en entier
ou autre). Mais le message original parlait de récupérer seulement
deux décimales, ce qui est possible bien entendu (mais il n'est
pas nécessaire d'utiliser 0.5 alors... voir les autres messages).
Je voulais seulement dire qu'il ne suffit pas d'ajouter .5 après
avoir multiplié par une puissance de 10 pour récupérer une valeur
qu'on pense avoir stockée, avec une certaine précision (en entier
ou autre). Mais le message original parlait de récupérer seulement
deux décimales, ce qui est possible bien entendu (mais il n'est
pas nécessaire d'utiliser 0.5 alors... voir les autres messages).