绕过MQL4和MQL5中的Digits(),获取任何数字的小数位数(不仅仅是引号)。 - 页 12

 
Ilya Malev:

这可能是最好的解决方案

在平等的基础上比较双数是不正确的,此外,任务是精确到符号。

看看MT4中的stdlib.mq4文件,有一个正确的双重对比的例子

比较双数()

SZZ:这里有一篇关于这个问题的文章https://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • www.mql5.com
При программировании на языке MQL4 у новичков порой возникают ситуации, когда результаты некоторых математических вычислений отличаются от ожидаемых. При этом программа компилируется и работает, но не так, как нужно. Они начинают разбираться в программе, находят новые "ошибки" в языке, реализации функций и т.п. В большинстве случаев последующий...
 
Aliaksandr Hryshyn:
我想知道你将如何计算对数,用非整数的力量,使用三角学,....使用第三方库,指标...他们都有错误!

如果你需要超百万的精度,你可以使用特殊的外部库,如gnu mp

否则,如果你需要保证精度(当在每个操作中计算误差时),你可以使用各种 "区间库"。

如果这还不够--你可以用多项式来代替数字

我从来没有见过这种情况,当这种电路真正用于MT 时 :-)

有一个双倍的眼睛 :-)

 
Igor Makanu:

在平等的基础上比较双打是不正确的,此外,任务是要精确到一个符号

看看MT4中的stdlib.mq4文件,有一个正确的双重比较的例子

比较双数()

好吧,好吧,用CompareDoubles的运行时间飙升了2倍。那么这样就更好了。

int dtd(double f)
 {
  f/=0.0000001;
 
  if(int(fmod(f,10000000))==0)
   {
    return 0;
   }
  if(int(fmod(f,1000000))==0)
   {
    return 1;
   }
  if(int(fmod(f,100000))==0)
   {
    return 2;
   }
  if(int(fmod(f,10000))==0)
   {
    return 3;
   }
  if(int(fmod(f,1000))==0)
   {
    return 4;
   }
  if(int(fmod(f,100))==0)
   {
    return 5;
   }
  if(int(fmod(f,10))==0)
   {
    return 6;
   }
  return 7;
 }
 
Ilya Malev:

好吧,好吧,用CompareDoubles的执行时间飙升了2倍。你最好这样做。

我们谈论的是正确的计算,我现在不能检查你的代码,但这并不困难,你需要将你的例子与在循环中使用DoubleToStr()的例子进行比较,如果没有区别,那么一切都正确。

ZS: 我试着用fmod(),我想我贴了一个例子,它不能正常工作,就像在0.07应该检查 - 立即弹出一个错误

 
Igor Makanu:

我们谈论的是正确的计算,我现在不能检查你的代码,但这并不难,你需要将你的例子与在循环中使用DoubleToStr()的例子进行比较,如果没有差别,那么一切都正确。

我已经检查过了,并计算了速度,这是最好的方法。当然,除非你需要寻找7个以上的字符。

S.s. 0.7和0.07以及500000000.0001等都计算正确。

但对于500000000.9991,它的处理情况更糟。但在外汇实践中,这几乎不重要。

 
Ilya Malev:

但在外汇实践中,这几乎不重要。

这取决于问题。如果是交易订单,那么这个问题就没有意义了--价格是以数字为标准的,而手数是相对于最小手数的。

如果是数学建模的问题,可能会有帮助。

 
Igor Makanu:

这取决于问题,如果是交易订单,那么这个任务根本就没有意义--价格被规范化为数字,而手数是相对于最小手数的。

如果任务是与数学建模有关,它可能是有用的。

当然,不是为了写神经网络=)))说,把价格/地段/金钱存储为带小数点的4字节整数,减少2倍的数据大小,很方便。

 
Igor Makanu:

在平等的基础上比较双打是不正确的,此外,任务是要精确到一个符号

看看MT4中的stdlib.mq4文件,有一个正确的双重对比的例子

比较双数()

SZZ:这里有一篇关于这个问题的文章https://www.mql5.com/ru/articles/1561

因此,任务是确定x被归一化为多少个数字。因此,它是可以的。除非你懒得写这样的梯子。

 
Dmitry Fedoseev:

除非你懒得写这样的梯子。

没有梯子也可以做,但要花10%的时间。

int dtd2(double f)
 {
  f/=0.0000001;
  int d = 0, i = 10000000;
 
  while( d < 7 && int( fmod( f, i ) ) > 0 )
   {
    i /= 10;
    d ++ ;
   }

  return d ;
 }
 
Ilya Malev:

没有梯子也可以做,但要花10%的时间。

这个:F/=0.0000001;是值得怀疑的。