¿Es posible obtener un valor "exacto"?

 

Saludos. Necesito ayuda con 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

Todas las funciones devuelven 0,1. Aunque (0,02*4,9) = 0,098 y debería devolver 0,09.

Por favor, dígame cómo obtener el valor exacto que devuelve mi calculadora. :)

 

0,02*4,9=0,098 -- no 0,98

salida en formato de 2 decimales -- 0,098 se emitirá redondeado a 0,10 según las reglas de redondeo

si se emite en formato de 3 dígitos -- se emitirá el número entero.

 
abolk:

0,02*4,9=0,098 -- no 0,98

salida en formato de 2 decimales -- 0,098 se emitirá redondeado a 0,10 según las reglas de redondeo

Si la salida está en formato de 3 dígitos -- se imprimirá el número entero.

Gracias, he corregido los números.

Ese es el problema, tienes que tomar 2 dígitos después del punto decimal. :) ¿Por qué es redondo? ¿Cómo se puede tomar un número fraccionario sin redondear y con sólo 2 dígitos después del punto decimal (0,09)?

 
WePlexus:

Gracias, he corregido las cifras.

Ese es el problema, hay que tomar dos decimales. :) ¿Por qué es redondo? ¿Cómo se puede tomar un número fraccionario sin redondear y con sólo 2 dígitos después del punto decimal (0,09)?

convertirlo en una cadena y tomar el número de dígitos
 
WePlexus:

Gracias, he corregido las cifras.

Ese es el problema, hay que tomar dos decimales. :) ¿Por qué es redondo? ¿Cómo se puede tomar un número fraccionario sin redondear y con sólo 2 dígitos después del punto decimal (0,09)?

int a=int(0.098/0.01);
   double b=a*0.01;
   Comment(DoubleToString(b,2));
 
sanyooooook:
tradúzcalo en una cadena y tome el número de caracteres que desee
¿No conoces una forma más fácil?
 
Vinin:
¿Conoces alguna forma más fácil
¿Puedes darme una pista? :)
 
valeryk:

Y si lo haces:

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

El resultado es 0,44 en lugar del 0,45 requerido.

 
WePlexus:

Y si lo haces:

El resultado es 0,44 en lugar del 0,45 requerido.

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

0,098, no 0,98. :)

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

Devuelve 1, y el valor exacto deseado = 0,09.

 
Vinin:
¿Conoces una forma más fácil?

eso es lo primero que me vino a la cabeza, claro que hay otros más sencillos.

Tampoco es complicado, pero quizá sea más 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

Razón de la queja: