Est-il possible d'obtenir une valeur "exacte" ?

 

Salutations. J'ai besoin d'aide pour résoudre un problème :

// 0.02 * 4.9 = 0.098
DoubleToStr (0.02 * 4.9, 2); // = 0.1
DoubleToString (0.02 * 4.9, 2); // = 0.1
NormalizeDouble (0.02 * 4.9, 2); // = 0.1

Toutes les fonctions renvoient 0,1. Bien que (0,02*4,9) = 0,098 et devrait retourner 0,09.

Veuillez me dire comment obtenir la valeur exacte qui renvoie ma calculatrice ? :)

 

0.02*4.9=0.098 -- pas 0.98

sortie au format 2 décimales -- 0.098 sera sortie arrondie à 0.10 selon les règles d'arrondi

si sortie au format 3 chiffres -- le nombre entier sera sorti.

 
abolk:

0.02*4.9=0.098 -- pas 0.98

sortie au format 2 décimales -- 0.098 sera sortie arrondie à 0.10 selon les règles d'arrondi

Si la sortie est au format à 3 chiffres, le nombre entier sera imprimé.

Merci, j'ai corrigé les chiffres.

C'est le problème, vous devez prendre 2 chiffres après la virgule. :) Pourquoi est-il arrondi ? Comment prendre un nombre fractionnaire sans arrondir et avec seulement 2 chiffres après la virgule (0,09) ?

 
WePlexus:

Merci, j'ai corrigé les chiffres.

C'est le problème, il faut prendre deux décimales. :) Pourquoi est-il arrondi ? Comment prendre un nombre fractionnaire sans arrondir et avec seulement 2 chiffres après la virgule (0,09) ?

le convertir en une chaîne de caractères et prendre le nombre de chiffres
 
WePlexus:

Merci, j'ai corrigé les chiffres.

C'est le problème, il faut prendre deux décimales. :) Pourquoi est-il arrondi ? Comment prendre un nombre fractionnaire sans arrondir et avec seulement 2 chiffres après la virgule (0,09) ?

int a=int(0.098/0.01);
   double b=a*0.01;
   Comment(DoubleToString(b,2));
 
sanyooooook:
le traduire en une chaîne de caractères et prendre le nombre de caractères que vous voulez
Vous ne connaissez pas un moyen plus facile ?
 
Vinin:
Connaissez-vous un moyen plus facile
Pouvez-vous me donner un indice ? :)
 
valeryk:

Et si vous le faites :

int a=int((0.09*5)/0.01);
double b=a*0.01;
Comment (DoubleToString (b,2));

La sortie est de 0,44 au lieu des 0,45 requis.

 
WePlexus:

Et si vous le faites :

La sortie est de 0,44 au lieu des 0,45 requis.

int a=int(MathFloor((0.98)/0.001));
   double b=a*0.001;
   Comment(DoubleToString(b,2));
 
valeryk:

0,098, et non 0,98. :)

int a = int (MathFloor ((0.098) / 0.001));
double b = a * 0.001;
Comment (DoubleToString (b, 2));

Renvoie 1, et la valeur exacte recherchée = 0.09.

 
Vinin:
Connaissez-vous un moyen plus facile ?

c'est la première chose qui m'est venue à l'esprit, bien sûr il y en a des plus simples.

Ce n'est pas compliqué non plus, mais c'est peut-être plus lent :

   int DIGITS=2;
   string stroka=DoubleToString(0.09845,8);
   int P=StringFind(stroka,".");
   Print(stroka);
    stroka=StringSubstr(stroka,0,P+DIGITS+1);
   Print(StringToDouble(stroka));

возвращает:

2014.10.04 11:32:53.731	normalize EURUSD,H4: 0.09
2014.10.04 11:32:53.731	normalize EURUSD,H4: 0.09845000

Raison: