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

 

曾几何时,为圆润的底部和顶部做了一些功能

可能会对某人有所帮助

//+------------------------------------------------------------------+
double RoundMax(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price+MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
double RoundMin(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price-MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
int MyK(double price,double symbol_point,int symbol_digits)
  {
   double tmp1=NormalizeDouble(price, symbol_digits);
   double tmp2=NormalizeDouble(price, symbol_digits-1);
   return((MathAbs(tmp1-tmp2)<symbol_point)?10:5);
  }
//+------------------------------------------------------------------+
 
Victor Nikolaev:

曾几何时,为圆润的底部和顶部做了一些功能

可能会对某人有所帮助

谢谢,我将为我的收藏品买下它。
 
lilita bogachkova:

试着得到一个0.99999999999999999 的结果

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*x-x = 10*0.99999999999-0.99999999999-0.99999999999

9*X = 9*0.99999999999999999

我们得到9*X=9或X等于1(一)。

v1 = (1/3) = 0.33333333 | v2 = 3*(1/3) = 1.00000000

或0.999999999999999=1.0

v1 (1.00000000) >= 1.0

在这种情况下,0.99999999999999999999代表1.0。但任务是 "丢弃",所以结果必须包括9。
 

感谢大家提供的有用的线索

我选择了通过NormalizeDouble 四舍五入,然后修剪最后一位数字的方案。到目前为止,它完全适合。

 

再次关于四舍五入......

请告知有关情况(不要扔西红柿,我是一个人道主义者)。

有这样一个变量。

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

德尔塔最初是规范化的。

OrderLots可能应该返回规范化的配音。

但不知何故,有时在罕见的情况下,我得到了2.775557561562891e-17这样的数字。

所以它几乎是零,但不是零.......

第一个问题 - 这是否正常?

第二个问题--根据我的理解,我只需做第二次归一化以避免尾巴?

第三个问题(我觉得反正我也听不懂,但我还是要问)。

两个归一化的数字相加能否得到非归一化的数字?

P.S. 我很抱歉再次提出这个问题,但我只是没有力量再重新阅读一遍


 
transcendreamer:

再次关于四舍五入......

请告知有关情况(不要扔西红柿,我是一个人道主义者)。

有这样一个变量。

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

德尔塔最初是规范化的。

OrderLots可能应该返回规范化的配音。

但不知何故,有时在罕见的情况下,我得到了2.775557561562891e-17这样的数字。

所以它几乎是零,但不是零.......

第一个问题 - 这是否正常?

第二个问题--根据我的理解,我只需做第二次归一化以避免尾巴?

第三个问题(我觉得反正我也听不懂,但我还是要问)。

两个归一化的数字相加能否得到非归一化的数字?

P.S. 请原谅我再次提起,但我实在没有精力全部重读一遍

  1. 是的。
  2. 是的。
  3. 是的。
 
fxsaber:
  1. 是的。
  2. 是的。
  3. 是的。
谢谢你
 
transcendreamer:

P.S. 我为再次提出这个问题而道歉,但我实在没有精力再去看一遍。

最好是自己用不同的例子来检查,这样会让你有一个了解。

唯一的问题是,我做错了。

if(delta>0)

但像这样。

if(delta>0.0)

对于双数。我不知道这是否真的重要,但在我的变体中,我从未遇到过错误(我只尝试比较相同类型的变量)。

 
Andrey Dik:

我不知道这是否真的重要,但我的版本从未遇到过错误(我只尝试比较相同类型的变量)。

它没有。
 
有些数字只能用无限小数来表示,如十进制中的1/3。但1/3在三级系统中不是一个无限的分数,在那里它==0.1。也就是说,不同的数字系统都有自己的无限小数。因此,十进制的非无限小数在二进制中可以是1。例如:0.1,0.2,0.3,0.4,...。没有确切的二进制表示。如果你调用NormalizeDouble 十次,它要么是0.199999999...1,要么是0.200000...1。 我不知道,也许这就是新闻。