È possibile ottenere un valore "esatto"?

 

Saluti. Ho bisogno di aiuto per un problema:

// 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

Tutte le funzioni restituiscono 0,1. Anche se (0,02*4,9) = 0,098 e dovrebbe restituire 0,09.

Per favore, ditemi come ottenere il valore esatto che restituisce la mia calcolatrice? :)

 

0.02*4.9=0.098 -- non 0.98

output in formato 2 cifre decimali -- 0.098 sarà emesso arrotondato a 0.10 secondo le regole di arrotondamento

se l'output è in formato a 3 cifre -- verrà emesso il numero intero.

 
abolk:

0.02*4.9=0.098 -- non 0.98

output in formato 2 cifre decimali -- 0.098 sarà emesso arrotondato a 0.10 secondo le regole di arrotondamento

Se l'output è in formato a 3 cifre, verrà stampato il numero intero.

Grazie, ho corretto i numeri.

Questo è il problema, devi prendere 2 cifre dopo il punto decimale. :) Perché è arrotondato? Come si può prendere un numero frazionario senza arrotondamento e solo 2 cifre dopo la virgola (0,09)?

 
WePlexus:

Grazie, ho corretto le cifre.

Questo è il problema, bisogna prendere due cifre decimali. :) Perché è arrotondato? Come si può prendere un numero frazionario senza arrotondamento e solo 2 cifre dopo la virgola (0,09)?

convertirlo in una stringa e prendere il numero di cifre
 
WePlexus:

Grazie, ho corretto le cifre.

Questo è il problema, bisogna prendere due cifre decimali. :) Perché è arrotondato? Come si può prendere un numero frazionario senza arrotondamento e solo 2 cifre dopo la virgola (0,09)?

int a=int(0.098/0.01);
   double b=a*0.01;
   Comment(DoubleToString(b,2));
 
sanyooooook:
tradurlo in una stringa e prendere il numero di caratteri che volete
Non conosci un modo più semplice?
 
Vinin:
Conosci un modo più semplice
Puoi darmi un suggerimento? :)
 
valeryk:

E se lo fai:

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

L'uscita è di 0,44 invece dello 0,45 richiesto.

 
WePlexus:

E se lo fai:

L'uscita è di 0,44 invece dello 0,45 richiesto.

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

0,098, non 0,98. :)

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

Restituisce 1, e voleva un valore esatto = 0,09.

 
Vinin:
Conosci un modo più semplice?

Questa è la prima cosa che mi è venuta in mente, naturalmente ce ne sono di più semplici.

Non è nemmeno complicato, ma forse è più lento:

   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