Como arredondar sempre pra 0 ou 5

 

Algué pode me falar qual função eu uso para arredondar um valor sempre pra 0 ou 5?
Uma vez que na BMF o Indice anda de 5 em 5 pontos

Ou seja se eu dividir 60155 por 2 (60155/2) vai dar = 30077,5, então a função arredondaria para 30080

 
Guilherme Mendonca:

Algué pode me falar qual função eu uso para arredondar um valor sempre pra 0 ou 5?
Uma vez que na BMF o Indice anda de 5 em 5 pontos

Ou seja se eu dividir 60155 por 2 (60155/2) vai dar = 30077,5, então a função arredondaria para 30080

Olá Guilherme Mendonca,

Por favor dê uma olhada nas funções MathMod e NormalizeDouble.

Elas podem ser utilizadas para tal finalidade.

Abraços,
Malacarne

 

Para arredondar tem que fazer a divisão para achar o resto, aqui um exemplo de arrendondar pra cima:


precoParaWIN = (int) MathCeil(precoQuebrado90147.66959);
precoParaWIN = (int)(precoParaWIN+(5-MathMod(precoParaWIN,5)));


Ao invés de usar MathCeil, pode-se usar o NormalizeDouble como o rodrigo falou

 
Jonatas Rafael:

Para arredondar tem que fazer a divisão para achar o resto, aqui um exemplo de arrendondar pra cima:



Ao invés de usar MathCeil, pode-se usar o NormalizeDouble como o rodrigo falou

Rapaz, valeu Jonatas !

Procurei muito nos foruns e a sua resposta foi a solução.

Obrigado por compartilhar.

 

Oi pessoal!

A minha dúvida caminha paralelamente a do tópico (se julgarem necessário crio outro específico para não poluir este).


Precisava arredondar números inteiros para unidade 0 quando a unidade for 1, 2, 3, ou 4 e para unidade 5 quando a unidade for 6,7, 8 ou 9. 0 e 5 permanecendo no mesmo jeito.

De maneira que os seguintes inteiros:

0,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.

Ficariam assim:

0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15, 20.


Alguma luz nesse sentido?

 
israeltandrade:

Oi pessoal!

A minha dúvida caminha paralelamente a do tópico (se julgarem necessário crio outro específico para não poluir este).


Precisava arredondar números inteiros para unidade 0 quando a unidade for 1, 2, 3, ou 4 e para unidade 5 quando a unidade for 6,7, 8 ou 9. 0 e 5 permanecendo no mesmo jeito.

De maneira que os seguintes inteiros:

0,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.

Ficariam assim:

0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15, 20.


Alguma luz nesse sentido?

De uma maneira simples usando a parte inteira da divisão por 5, você consegue.

Ex:

0/5 = 0

1/5 = 0,2

2/5 = 0,4

3/5 = 0,6

4/5 = 0,8

5/5 = 1,0

6/5 = 1,2

7/5 = 1,4

8/5 = 1,6

9/5 = 1,8

10/5 = 2,0

11/5 = 2,2


Dessa forma dá pra perceber que há um padrão, que pode ser representado pela seguinte fórmula:

Resultado = Quociente_Inteiro*5

Tomando 11/5 como exemplo:

Resultado = 2*5 = 10



EDIT: Havia escrito "Resto" nos exemplos
 
israeltandrade:

Oi pessoal!

.....

void Round(double n, int x)
  {
   Print(floor(n/x)*x);
  }


void OnStart()
  {
//---
   Round(368, 5);

  }
 
billy010190:

De uma maneira simples usando a parte inteira da divisão por 5, você consegue.

Ex:

Resto de 0/5 = 0

Resto de 1/5 = 0,2

Resto de 2/5 = 0,4

Resto de 3/5 = 0,6

Resto de 4/5 = 0,8

Resto de 5/5 = 1,0

Resto de 6/5 = 1,2

Resto de 7/5 = 1,4

Resto de 8/5 = 1,6

Resto de 9/5 = 1,8

Resto de 10/5 = 2,0

Resto de 11/5 = 2,2


Dessa forma dá pra perceber que há um padrão, que pode ser representado pela seguinte fórmula:

Resultado = Quociente_Inteiro*5

Tomando 11/5 como exemplo:

Resultado = 2*5 = 10

Que solução elegante! Matematicamente simples e resolve o problema. Suponho que deva criar uma variável do tipo inteira pra representar o quociente. Correto? (assim ele ignora o ponto flutuante na hora do próximo cálculo)
 
israeltandrade:
Que solução elegante! Matematicamente simples e resolve o problema. Suponho que deva criar uma variável do tipo inteira pra representar o quociente. Correto? (assim ele ignora o ponto flutuante na hora do próximo cálculo)
O código acima faz exatamente o que o @ billy010190 disse, usa a parte inteira da divisão para multiplicar por um número que quer arredondar. 

floor(n/x)*x

Onde n é o seu número e x é o número usado para arredondar, vai funcionar para qualquer numero que passe, exemplo 100, ira arredondar de 100 em 100. 
floor arredonda para o número inteiro mais próximo abaixo, se quiser para cima tem que usar ceil ou MathCeil

 

Apenas mais uma sugestão.... Para obter automaticamente o valor do tick padrão do ativo:


tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
preco = round(preco / tickSize) * tickSize;
 
Jonathan Pereira:
O código acima faz exatamente o que o @  billy010190 disse, usa a parte inteira da divisão para multiplicar por um número que quer arredondar. 


Onde n é o seu número e x é o número usado para arredondar, vai funcionar para qualquer numero que passe, exemplo 100, ira arredondar de 100 em 100. 
floor arredonda para o número inteiro mais próximo abaixo, se quiser para cima tem que usar ceil ou MathCeil


Ótimo! Não conhecia essa função. Obrigado!

Razão: