Arredondamento de números em MT4 via NormalizeDouble - página 3

 

Matemática. Grau 6. Livro-texto. Nikolsky S.M., Potapov M.K. Moscou: 2012. - 256 с

Arredondamento.

Arredondamento

 

Que tema acalorado este acabou por ser. O MT4 parece funcionar corretamente com os arredondamentos.
Eu quis dizer paraNormalizeDouble(0.055,2) não para arredondar o número"0.055" para "0.06", mas para apará-lo para "0.05".

Estou tendo problemas para entender estas funções MKL. Eu realmente não entendo porque "1.0015223567" deve ser arredondado usando NormalizeDouble, se tudo o que você quer é levar o número BORROWN para o lugar certo.
Ou seja, para NormalizarDuplo(1.001526789, 5) resultaria em "1.00152". Não precisa
ser arredondadopara "1,00153". Deve haver a função RoundDouble para isso =)

Isso é possível? Ou é necessário arredondá-lo o tempo todo e obter os números errados?

 

É melhor você já se decidir. É um arredondamento:

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Arredondamento de números em MT4 via NormalizeDouble

Roman Starinskij, 2016.01.21 10:03

Olá. Você pode me dizer qual é o problema?

Por que a função NormalizeDuplo(0,055,2) arredonda o número "0,055" para "0,06"?

Não é uma função de arredondamento de fração.


Não tem:

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Arredondamento de números em MT4 via NormalizeDouble

Roman Starinskij, 2016.01.25 14:30

Que tema acalorado este acabou por ser. O MT4 parece funcionar corretamente com o arredondamento.
Eu quis dizerNormalizeDouble(0,055,2) não para arredondar o número"0,055" para "0,06", mas para apará-lo para "0,05".

Estou tendo problemas para entender estas funções MKL. Eu realmente não entendo porque "1.0015223567" deve ser arredondado com a função NormalizeDouble, se tudo o que você quer é levar o número DIRECT para o lugar certo.
Ou seja, para NormalizarDuplo(1.001526789, 5) resultaria em "1.00152". Não precisa
ser arredondadopara "1,00153". Deve haver a função RoundDouble para isso =)

Isso é possível? Ou é necessário arredondá-lo o tempo todo e obter números que você não quer?


E em nome da experimentação:

//+------------------------------------------------------------------+
//|                                              NormalizeDouble.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
#property description "Проверка NormalizeDouble"
input double   value=0.055;      // нормализуемое число 
input int      digits=2;         // кол-во знаков после запятой 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print("Число ",value," округлённое с точностью до ",digits," знаков = ",NormalizeDouble(value,digits));
  }
//+------------------------------------------------------------------+
Arquivos anexados:
Test.mq5  2 kb
 
Roman Starinskij:

Que tema acalorado este acabou por ser. O MT4 parece funcionar corretamente com o arredondamento.
Eu quis dizer paraNormalizeDouble(0.055,2) não para arredondar o número"0.055" para "0.06", mas para apará-lo para "0.05".

Estou tendo problemas para entender estas funções MKL. Eu realmente não entendo porque "1.0015223567" deve ser arredondado com a função NormalizeDouble, se tudo o que você quer é levar o número BORROWN para o lugar certo.
Ou seja, para NormalizarDuplo(1.001526789, 5) resultaria em "1.00152". Não precisa
ser arredondadopara "1.00153". Deve haver a função RoundDouble para isso =)

Isso é possível? Ou você precisa arredondar o tempo todo e obter números que você não quer?

Se você precisa aparar, então aparar; se você precisa arredondar, então arredondar. A função NormalkizeDouble() é o que você mais freqüentemente precisa.

Por que você acha que RoundDouble() deve ser usado em vez de NormalizeDouble()? Você criou este mundo? É correto que uma bola esteja rolando e um quadrado tenha quatro cantos?

 
Roman Starinskij:

Que tema acalorado este acabou por ser.


Tudo isso porque o iniciante do tópico não lê a documentação do idioma e não ouve o que ele diz
 
Slawa:
Isto porque o autor não lê a documentação lingüística e não escuta o que lhe é dito.

O seguinte comportamento de divisão e arredondamento das frações é um pouco obscuro.

Há 2 equações:
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

Usando a função NormalizeDouble recomendada, obtemos estes resultados:
0.03999999999999999 = 0.04
0.036 = 0.04

No primeiro exemplo, precisamos realmente obter o valor 0,04, mas no segundo precisamos 0,03 (é assim que funciona uma calculadora normal).
NormalizeDouble deve ser usado porque são devolvidas frações que não estão completas, mas no segundo caso, a função retorna valores incorretos, e também não é possível não utilizá-la para o primeiro exemplo.

 
Roman Starinskij:

O seguinte comportamento de divisão e arredondamento das frações é um pouco obscuro.

Há duas equações:
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

Usando a função NormalizeDouble recomendada, obtemos estes resultados:
0.03999999999999999 = 0.04
0.036 = 0.04

No primeiro exemplo, precisamos realmente obter o valor 0,04, mas no segundo precisamos 0,03 (é assim que funciona uma calculadora normal).
NormalizeDouble deve ser usado porque são devolvidas frações que não estão completas, mas no segundo caso, a função retorna valores incorretos, e também não é possível não utilizá-la para o primeiro exemplo.

Sua calculadora normal não calcula corretamente, ela deveria:

 
Slawa:
Tudo porque o iniciante do tópico não lê a documentação do idioma e não escuta o que lhe é dito

se N+1 dígito < 5, então o dígito N é retido e N+1 e todos os dígitos subsequentes são zerados;

se o dígito N+1 ≥ 5, o dígito N é incrementado em um e N+1 e todos os dígitos subseqüentes são zerados;

Desculpe, mas ainda não entendo porque o arredondamento por '2' não permite imediatamente = 0,06000000

void OnStart()
  {

   double v1 = NormalizeDouble(0.055,3);
   double v2 = NormalizeDouble(0.0549,3);

   v1=NormalizeDouble(v1,2);
   v2=NormalizeDouble(v2,2);
   Print("v1 = ",DoubleToString(v1),", v2 = ",DoubleToString(v2));

  }

v1 = 0,06000000, v2 = 0,06000000

void OnStart()
  {

   double v1 = NormalizeDouble(0.055,2);
   double v2 = NormalizeDouble(0.0549,2);

   Print("v1 = ",DoubleToString(v1),", v2 = ",DoubleToString(v2));

  }

v1 = 0,06000000, v2 = 0,05000000

void OnStart()
  {
   for(int i=7;i>=1;i--)
     {
      double v1 = 1.1234567;
      double v2 = NormalizeDouble(v1,i+1);

      v1=NormalizeDouble(v1,i);
      v2=NormalizeDouble(v2,i);
      Print("v1 = ",i," = ",DoubleToString(v1,7),", v2 = ",i," = ",DoubleToString(v2,7));
     }
     Print("---");
  }

---

v1 = 1 = 1.1000000, v2 = 1 = 1.1000000
v1 = 2 = 1.1200000, v2 = 2 = 1.1200000
v1 = 3 = 1.1230000, v2 = 3 = 1.1240000
v1 = 4 = 1.1235000, v2 = 4 = 1.1235000
v1 = 5 = 1.1234600, v2 = 5 = 1.1234600
v1 = 6 = 1.1234570, v2 = 6 = 1.1234570
v1 = 7 = 1,1234567, v2 = 7 = 1,1234567




 
lilita bogachkova:


Sinto muito, mas ainda não entendo porque arredondar por '2' não permite obter = 0,06000000


Porque é 0,6, então 0,5 só pode ser obtido através de batota.
 
lilita bogachkova:

Sinto muito, mas ainda não entendo porque arredondar por '2' torna impossível obter = 0,06000000


Quando apenas um dígito é normalizado, é simples: 0, 1, 2, 3, 4 -> 0, e 5, 6, 7, 8, 9 -> 1.

Quando dois dígitos são normalizados, são levados em conta números de dois dígitos: 0 - 49 -> 0, e 50 - 99 -> 1. Afinal, se o número 1,49 tem que ser arredondado para números inteiros, será que realmente temos que obter 2, que é 51 centésimos contra os 49 centésimos disponíveis de distância para 1?

O mesmo com três dígitos, quatro dígitos, etc.