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

 

数学。六年级。教科书。Nikolsky S.M., Potapov M.K. Moscow: 2012.- 256 с

四舍五入。

四舍五入

 

这已经变成了一个多么激烈的话题。MT4似乎在四舍五入方面工作正常。
我的意思是NormalizeDouble(0.055,2) 不是把数字"0.055 "四舍五入 到 "0.06",而是把它修剪到 "0.05"。

我很难理解这些MKL功能。我不太明白为什么 "1.0015223567 "要用NormalizeDouble进行四舍五入,如果你只想把BORROWN数字带到正确的位置。
也就是说,将NormalizeDouble(1.001526789, 5)的结果是 "1.00152"。它不需要
被四舍五入"1.00153"一定有RoundDouble函数来解决这个问题=)

这有可能吗?还是有必要一直四舍五入,得到错误的数字?

 

你最好已经下定决心。这是四舍五入。

关于交易、自动交易系统和交易策略测试的论坛

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

Roman Starinskij, 2016.01.21 10:03

你好。你能告诉我这是什么问题吗?

为什么函数NormalizeDouble(0.055,2) 将数字"0.055 "取整 为 "0.06"?

这不是一个分数四舍五入的功能。


它没有。

关于交易、自动交易系统和测试交易策略的论坛

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

Roman Starinskij, 2016.01.25 14:30

这已经变成了一个多么激烈的话题。MT4似乎在四舍五入方面工作正常。
我的意思是NormalizeDouble(0.055,2) 不是把数字"0.055 "四舍五入 到 "0.06",而是把它修剪到 "0.05"。

我很难理解这些MKL功能。我不太明白为什么 "1.0015223567 "要用NormalizeDouble函数进行四舍五入,如果你只想把BORROWN的数字带到正确的位置。
也就是说,将NormalizeDouble(1.001526789, 5)的结果是 "1.00152"。它不需要
被四舍五入"1.00153"一定有RoundDouble函数来解决这个问题=)

这有可能吗?还是有必要一直圆下去,得到你不想要的数字?


而且是为了实验的需要。

//+------------------------------------------------------------------+
//|                                              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));
  }
//+------------------------------------------------------------------+
附加的文件:
Test.mq5  2 kb
 
Roman Starinskij:

这已经变成了一个多么激烈的话题。MT4似乎在四舍五入方面工作正常。
我的意思是NormalizeDouble(0.055,2) 不是把数字"0.055 "四舍五入 到 "0.06",而是把它修剪到 "0.05"。

我很难理解这些MKL功能。我不太明白为什么 "1.0015223567 "要用NormalizeDouble函数进行四舍五入,如果你只想把BORROWN的数字带到正确的位置。
也就是说,将NormalizeDouble(1.001526789, 5)的结果是 "1.00152"。它不需要
被四舍五入"1.00153"一定有RoundDouble函数来解决这个问题=)

这有可能吗?还是你需要一直圆下去,得到你不想要的数字?

如果你需要修剪,那就修剪;如果你需要圆形,那就圆形。NormalkizeDouble()函数是圆的,这是你最经常需要的东西。

为什么你认为应该使用RoundDouble()而不是NormalizeDouble()?这个世界是你创造的吗?一个球在滚动,一个正方形有四个角,这样可以吗?

 
Roman Starinskij:

这已经变成了一个多么激烈的话题。


这都是因为话题发起人没有阅读语言文档,也没有听从他的指示。
 
Slawa:
这是因为作者没有阅读语言文件,也没有听从别人的建议。

下面的分数除法和四舍五入的行为有点不清楚。

有2个方程式。
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

使用推荐的NormalizeDouble函数,我们得到这些结果。
0.03999999999999999 = 0.04
0.036 = 0.04

在第一个例子中,我们确实需要得到0.04 的数值,但在第二个例子中,我们需要0.03(这就是普通计算器的工作原理)。
应该使用NormalizeDouble,因为返回的分数是不完整的,但在第二种情况下,该函数返回的值是不正确的,对于第一个例子,你也不能不使用它。

 
Roman Starinskij:

下面的分数除法和四舍五入的行为有点不清楚。

有两个方程式。
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

使用推荐的NormalizeDouble函数,我们得到这些结果。
0.03999999999999999 = 0.04
0.036 = 0.04

在第一个例子中,我们确实需要得到0.04 的数值,但在第二个例子中,我们需要0.03(这就是普通计算器的工作原理)。
应该使用NormalizeDouble,因为返回的分数是不完整的,但在第二种情况下,该函数返回的值是不正确的,对于第一个例子,你也不能不使用它。

你的普通计算器不能正确计算,它应该是这样的。

 
Slawa:
所有这些都是由于专题负责人没有阅读语言文件,没有听从他的指示。

如果N+1位数<5,则保留第N位数,N+1和所有后续位数被清零。

如果N+1位数≥5,则第N位数增加1,N+1 ,所有后续位数被清零。

对不起,但我仍然不明白为什么四舍五入'2'不能立即允许=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:


我很抱歉,但我还是不明白为什么用'2'四舍五入不能得到=0.06000000


因为它是0.6,所以0.5只能通过作弊获得。
 
lilita bogachkova:

我很抱歉,但我还是不明白为什么四舍五入'2'使它不可能得到=0.06000000


当只有一个数字被规范化时,很简单:0、1、2、3、4 -> 0,5、6、7、8、9 -> 1。

当两位数被规范化时,两位数被考虑在内:0 - 49 -> 0,50 - 99 -> 1。毕竟,如果数字1.49必须被四舍五入为整数,我们真的要得到2,也就是51个百分点与1的可用49个百分点的距离吗?

三位数、四位数等也一样。