OVH Cloud OVH Cloud

resultat formule =ENT(MOD(xxxxx)) érronée

1 réponse
Avatar
bellou
la formule =ENT(MOD(A1*100;100)) me donne le même résultat pour A1=10.02
et A1= 10.03:

cellule A1: 10.02 =ENT(MOD(A29*100;100)) donne 2 (correct)
cellule A1: 10.03 =ENT(MOD(A29*100;100)) donne 2 au lieu de 3 (incorrect)

j'utilise ça pour transformer des prix ecrit en chiffres en lettres.
(ça me donne des erreurs de centimes génantes!)
j'ai ce pb avec excel 2003 sur xp, et excel 200 sur windows2000

1 réponse

Avatar
Jean-Claude Arbaut
Le 30/06/05 16:46, dans ,
« bellou » a écrit :

la formule =ENT(MOD(A1*100;100)) me donne le même résultat pour A1.02
et A1= 10.03:

cellule A1: 10.02 =ENT(MOD(A29*100;100)) donne 2 (correct)
cellule A1: 10.03 =ENT(MOD(A29*100;100)) donne 2 au lieu de 3 (incorrect)


Boulette: tu modifie A1 et ta formule utilise A29 :-) Mais le problème est
pas là.

j'utilise ça pour transformer des prix ecrit en chiffres en lettres.
(ça me donne des erreurs de centimes génantes!)
j'ai ce pb avec excel 2003 sur xp, et excel 200 sur windows2000


Cela vient de la façon de calculer du processeur (et donc d'Excel, mais ce
n'est pas de sa faute):

A1: 10.03 B1: =MOD(A1*100;100) C1: ±=3
A2: 1003 B2: =MOD(A2;100) C2: ²=3

Tu trouve C1úUX, C2=VRAI.
En fait, B1<3, donc la partie entière vaut bien 2.

Si les calculs étaient exacts, tu aurait bien C1=VRAI, le problème, c'est
que les calculs sont faits avec des nombres "flottants", à virgule, et codés
en binaire. Or dans ce système, 10.03 n'existe pas. Il est remplacé par un
nombre très proche, 10.0299999999999993605115378159098327159881591796875,
qui lui est codé exactement dans l'ordinateur (le codage suit le standard
IEEE754, il y a des docs sur Internet). Ce nombre approché s'écrit aussi
5646388032815759 * 2^-49, au passage.
Bref, tu multiplie par 100, ce qui donne
1002.9999999999998863131622783839702606201171875, le modulo 100 donne
2.9999999999998863131622783839702606201171875, et alors tu es grillé avec ta
partie entière.

Seule solution: bien piger comment marche la virgule flottante, car c'est
piégeux. Ensuite, su tu veux absolument utiliser des fonctions comme MOD et
ENT sans avoir des résultats bizarres, il faut faire tous tes calculs sur
des *entiers*. Par exemple, tu compte en centimes, et tu aura 1003 (entier,
et exact) à la place de 10.03 (inexact).

Tu peux remarquer que 10.02 n'est pas exact non plus:
10.019999999999999573674358543939888477325439453125,
mais coup de chance, quand on multiplie par 100, on obtient
1002, exactement (en raison de l'arrondi lors de la multiplication).