在MT4中通过NormalizeDouble对数字进行四舍五入 - 页 9

 
Алексей Тарабанов:
关于四舍五入的八页。我想我们以前在四年级的时候就学过这个。
已经有一些关于割礼的讨论了 :)
 
Алексей Тарабанов:
关于四舍五入的八页。我想我们以前在四年级的时候就学过这个。
不是所有的人;|
 
Dmitry Fedoseev:
呵。那是错误的方式。完全错误的结果。
像什么?
 
lilita bogachkova:

+++

然而,如果一个数字超过了小数点后15位,仍然需要以某种方式进行修剪,否则就不能正常工作。

双精度浮点数字精确到小数点后15-17位
 
Vasyl Nosal:
双精度浮点数字精确到小数点后15-17位
//+------------------------------------------------------------------+
//| 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 ! 测试 GBPUSDbc,H1: v1 = 0 = 1.12345678901235
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 1 = 1.1234567890123
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 2 = 1.123456789012
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 3 = 1.12345678901
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 4 = 1.1234567890
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 5 = 1.123456789
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 6 = 1.12345678
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 7 = 1.1234567
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 8 = 1.123456
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 9 = 1.12345
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 10 = 1.1234
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 11 = 1.123
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 12 = 1.12
0 21:59:20.485 ! 测试 GBPUSDbc,H1: v1 = 13 = 1.1

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

   ushort  Characters_delete=15;

0 22:01:25.346 ! 测试 GBPUSDbc,H1: v1 = 0 = 1.123456789012345

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0 22:01:25.346 ! 测试 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 ! 测试 GBPUSDbc,H1: v1 = 0 = 1.123456789012346

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0 22:01:25.346 ! 测试 GBPUSDbc,H1: v1 = 0 = 1.123456789012345

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0 22:01:25.346 ! 测试 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:Alert: 1.123456789012345

我已经打了折扣,不超过17个字符的配音。你还需要什么?


 
lilita bogachkova:
这里已经有一些关于割礼的讨论了 :)
1980年代初,毕业于诺金斯克编程学校的Antonina Loseva在我指导下工作。下面是她解决四舍五入问题的方法:int A = double B + 0.5
 
Vasyl Nosal:
比如说?

DoubleToStr(0.9999,3)=1.000

因此,请得出你的结论。

 
Vasyl Nosal:

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

我已经打了折扣,不超过17个字符的配音。你还需要什么?


尝试14个,并解释为什么

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 ! 测试 GBPUSDbc,H1: v1 = 0 = 0.90909091

0 22:15:05.379 ! 测试 GBPUSDbc,H1: v1 = 1 = 0.9090909 !

0 22:15:05.379 ! 测试 GBPUSDbc,H1: v1 = 2 = 0.9090909090

0 22:15:05.379 ! 测试 GBPUSDbc,H1: v1 = 3 = 0.9090909

0 22:15:05.379 ! 测试 GBPUSDbc,H1: v1 = 4 = 0.90909090

0 22:15:05.379 ! 测试 GBPUSDbc,H1: v1 = 5 = 0.9090909

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

0 22:15:05.379 ! 测试 GBPUSDbc,H1: v1 = 7 = 0.90909

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

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

0 22:15:05.379 ! 测试 GBPUSDbc,H1: v1 = 10 = 0.9090

0 22:15:05.379 ! 测试 GBPUSDbc,H1: v1 = 11 = 0.909

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

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

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