É possível obter um valor "exato"?

 

Saudações. Eu preciso de ajuda com um 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 as funções retornam 0,1. Embora (0,02*4,9) = 0,098 e deve retornar 0,09.

Por favor me diga como obter o valor exato que devolve minha calculadora? :)

 

0,02*4,9=0,098 -- não 0,98

saída em formato de 2 casas decimais -- 0,098 será arredondado para 0,10 de acordo com as regras de arredondamento

se a saída for no formato de 3 dígitos -- o número inteiro será emitido.

 
abolk:

0,02*4,9=0,098 -- não 0,98

saída em formato de 2 casas decimais -- 0,098 será arredondado para 0,10 de acordo com as regras de arredondamento

Se a saída estiver no formato de 3 dígitos - o número inteiro será impresso.

Obrigado, eu corrigi os números.

Esse é o problema, você tem que tomar 2 dígitos após o ponto decimal. :) Por que ele é arredondado? Como você pode tomar um número fracionário sem arredondamento e apenas 2 dígitos após o ponto decimal (0,09)?

 
WePlexus:

Obrigado, corrigiu os números.

Esse é o problema, você tem que tomar duas casas decimais. :) Por que ele é arredondado? Como você pode tomar um número fracionário sem arredondamento e apenas 2 dígitos após o ponto decimal (0,09)?

convertê-lo em um fio e pegar o número de dígitos
 
WePlexus:

Obrigado, corrigiu os números.

Esse é o problema, você tem que tomar duas casas decimais. :) Por que ele é arredondado? Como você pode tomar um número fracionário sem arredondamento e apenas 2 dígitos após o ponto decimal (0,09)?

int a=int(0.098/0.01);
   double b=a*0.01;
   Comment(DoubleToString(b,2));
 
sanyooooook:
traduzi-lo em um fio e pegar o número de caracteres que você quiser
Você não conhece uma maneira mais fácil?
 
Vinin:
Você conhece alguma forma mais fácil
Você pode me dar uma dica? :)
 
valeryk:

E se você o fizer:

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

A produção é de 0,44 em vez dos 0,45 necessários.

 
WePlexus:

E se você o fizer:

A produção é de 0,44 em vez dos 0,45 necessários.

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

0,098, não 0,98. :)

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

Retorna 1, e valor exato desejado = 0,09.

 
Vinin:
Você conhece uma maneira mais fácil?

Essa é a primeira coisa que me vem à cabeça, é claro que existem outras mais simples.

Também não é complicado, mas talvez seja mais 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ão: