Double vs FLOAT - erreur MathFloor peu claire - page 7

 
Maxim Kuznetsov:
En fonction de vos objectifs, il est parfois utile de passer aux chiffres entiers. Cela permet d'économiser beaucoup de nerfs :-) Une fois, j'ai eu une tâche, où je devais marquer précisément plusieurs niveaux, au début j'ai eu du mal avec le double, et puis j'ai tout converti en points entiers à partir de 0 et tout est devenu facile, simple et sans erreur.
C'est exactement ce que j'ai fait. Je l'ai converti en nombres entiers.
 
Vladimir:

Vous n'avez pas besoin d'utiliser les arrondis, sauf si la tâche l'exige.


C'est ça le problème : les tâches sont différentes :-)

 

Si vous utilisezMathFloor ou MathCeil pour l'arrondi, vous devez normaliser le résultat original à la précision correcte.

En effet, lors d'un calcul, au lieu d'un nombre entier, vous pouvez obtenir un nombre fractionnaire, et à cause de cette "queue" du nombre est mal arrondie, le résultat est incorrect.
Par exemple :

double point=0.01;
Print (DoubleToStr(1156.12/point, 15));
Print (NormalizeDouble(1156.12/point, _Digits));

essayons maintenant d'arrondir avecMathFloor

double point=0.01;
Print (DoubleToStr(MathFloor(1156.12/point), 15));
Print (MathFloor(NormalizeDouble(1156.12/point, _Digits)));
 

Si je normalise le nombre à 1,05 - il se normalisera à 1,1, ce qui en principen' estpas ce dont j'ai besoin en utilisantMathFloor :-)

Car je n'utiliserais pasdu tout MathFloor.

Mais le problème est différent.

 

Но задача то другая.  

Pourquoi est-ce différent ? Vous avez dit que vous aviez besoin d'arrondir à l'inférieur - MathFloor fait exactement cela.

 
Taras Slobodyanik:

Pourquoi est-ce différent ? Vous avez dit que vous deviez arrondir à l'inférieur - c'est ce que fait MathFloor.

oui !!! mais si je fais une normalisation, cela va arrondir les maths à l'inférieur etMathFloor n'aura plus de sens.

 

l'exemple ci-dessus avec le nombre 1156.12, ce nombre est stocké en mémoire comme 1156.11999999999999891

c'est-à-dire que si vous essayez de l'arrondir au centième, vous obtenez 1156,11 au lieu de 1156,12, ce qui est la "particularité" qui vous a fait vous creuser la tête.

 
Taras Slobodyanik:

l'exemple ci-dessus avec le nombre 1156.12, ce nombre est stocké en mémoire comme 1156.11999999999999891

c'est-à-dire que si vous essayez d'arrondir au centième, vous obtiendrez 1156.11 au lieu de 1156.12 - c'est la "particularité" de votre problème.

Oui :-) Merci.