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

 
Алексей Тарабанов:
Oito páginas sobre arredondamento. Acho que costumávamos aprender que na quarta série :(
Já se fala da circuncisão :)
 
Алексей Тарабанов:
Oito páginas sobre arredondamento. Acho que costumávamos aprender que na quarta série :(
Nem todos eles | |
 
Dmitry Fedoseev:
Heh. Esse é o caminho errado. Resultados totalmente errados.
Como por exemplo?
 
lilita bogachkova:

+++

Entretanto, se um número for maior que 15 casas decimais, ainda precisa ser aparado de alguma forma, caso contrário não funciona corretamente.

Os números de ponto flutuante de precisão dupla são precisos com 15-17 casas decimais
 
Vasyl Nosal:
Os números de ponto flutuante de precisão dupla são precisos com 15-17 dígitos decimais
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ushort  Characters_delete=14;
   for(int i=0;i<=Characters_delete;i++)
     {
      double v1=1.123456789012345;

      v1=DoubleCrop(v1,i,Characters_delete);

      Print("v1 = ",i," = ",DoubleToString(v1,Characters_delete-i));
     }
   Print("---");
  }
//+------------------------------------------------------------------+
//| Double Crop function                                             |
//+------------------------------------------------------------------+
double DoubleCrop(double value,int ii,ushort  Characters)
  {
   string data="",resoult="";
   data=DoubleToString(value,Characters);
   resoult=StringSubstr(data,0,StringLen(data)-ii);
   return StringToDouble(resoult);
  }
//+------------------------------------------------------------------+
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 0 = 1.12345678901235
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 1 = 1.1234567890123
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 2 = 1.123456789012
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 3 = 1.12345678901
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 4 = 1.1234567890
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 5 = 1.123456789
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 6 = 1.12345678
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 7 = 1.1234567
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 8 = 1.123456
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 9 = 1.12345
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 10 = 1.1234
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 11 = 1.123
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 12 = 1.12
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 13 = 1.1

0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 14 = 1

   ushort  Characters_delete=15;

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 0 = 1.12345676789012345

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 1 = 1.12345678901234

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 2 = 1.1234567890123

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 3 = 1.123456789012

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 4 = 1.12345678901

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 5 = 1.1234567890

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 6 = 1.123456789

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 7 = 1.12345678

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 8 = 1.1234567

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 9 = 1.123456

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 10 = 1.12345

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 11 = 1.1234

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 12 = 1.123

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 13 = 1.12

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 14 = 1.1

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 15 = 1

   ushort  Characters_delete=15;
   for(int i=0;i<=Characters_delete;i++)
     {
      double v1=1.1234567890123456;

      v1=DoubleCrop(v1,i,Characters_delete);

      Print("v1 = ",i," = ",DoubleToString(v1,Characters_delete-i));
     }
   Print("---");
  }

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 0 = 1.123456789012346

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 1 = 1.12345678901234

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 2 = 1.1234567890123

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 3 = 1.123456789012

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 4 = 1.12345678901

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 5 = 1.1234567890

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 6 = 1.123456789

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 7 = 1.12345678

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 8 = 1.1234567

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 9 = 1.123456

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 10 = 1.12345

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 11 = 1.1234

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 12 = 1.123

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 13 = 1.12

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 14 = 1.1

0 22:02:48.826 ! testes GBPUSDbc,H1: v1 = 15 = 1

 
lilita bogachkova:
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 0 = 1.12345678901235
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 1 = 1.1234567890123
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 2 = 1.123456789012
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 3 = 1.12345678901
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 4 = 1.1234567890
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 5 = 1.123456789
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 6 = 1.12345678
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 7 = 1.1234567
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 8 = 1.123456
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 9 = 1.12345
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 10 = 1.1234
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 11 = 1.123
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 12 = 1.12
0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 13 = 1.1

0 21:59:20.485 ! testes GBPUSDbc,H1: v1 = 14 = 1

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 0 = 1.12345676789012345

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 1 = 1.12345678901234

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 2 = 1.1234567890123

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 3 = 1.123456789012

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 4 = 1.12345678901

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 5 = 1.1234567890

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 6 = 1.123456789

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 7 = 1.12345678

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 8 = 1.1234567

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 9 = 1.123456

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 10 = 1.12345

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 11 = 1.1234

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 12 = 1.123

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 13 = 1.12

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 14 = 1.1

0 22:01:25.346 ! testes GBPUSDbc,H1: v1 = 15 = 1

И?
 
Vasyl Nosal:
И?
string data=DoubleToString(1.123456789012345,15); 
int lenth=StringLen(data);
data=StringSubstr(data,0,lenth);


Alert(data);

2016.02.25 22:06:56.781 prob EURUSD,H1: Alerta: 1.123456789012345

Desconto que não mais do que 17 caracteres dublados. O que mais você precisa?


 
lilita bogachkova:
Já se fala aqui da circuncisão :)
No início dos anos 80, Antonina Loseva, formada na escola de programação de Noginsk, estava trabalhando sob minha orientação. Eis como ela resolveu o problema do arredondamento para inteiros: int A = duplo B + 0,5
 
Vasyl Nosal:
Por exemplo?

DoubleToStr(0.9999,3)=1.000

Portanto, tire suas conclusões.

 
Vasyl Nosal:

2016.02.25 22:06:56.781 prob EURUSD,H1: Alerta: 1.123456789012345

Desconto que não mais do que 17 caracteres dublados. O que mais você precisa?


Tente 14 e explique por que

void OnStart()
  {
   ushort  Characters_delete=14;
   for(int i=0;i<=Characters_delete;i++)
     {
      double v1=1.0/1.1;

      v1=DoubleCrop(v1,i,Characters_delete);

      Print("v1 = ",i," = ",DoubleToString(v1,Characters_delete-i));
     }
   Print("---");
  }

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 0 = 0,909090909091

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 1 = 0,90909090909

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 2 = 0,909090909090

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 3 = 0,909090909

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 4 = 0.9090909090

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 5 = 0,909090909

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 6 = 0.90909090

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 7 = 0.9090909

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 8 = 0.909090

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 9 = 0.90909

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 10 = 0,9090

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 11 = 0,909

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 12 = 0.90

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 13 = 0.9

0 22:15:05.379 ! testes GBPUSDbc,H1: v1 = 14 = 0