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

 
Igor Makanu:

不,它不会工作...

哦,对了,我忘了,这是在明知是小于零的数字的情况下做出的,因为它被用于批次规范化。修正了它,现在可以了。

#define  EPSILON   0.000000001
#define  MORE(A,B) ((A)-(B)>EPSILON)

int Digit(double value)
  {
   int digits=0;
   value=MathMod(value,1.0);
   while(MORE(1.0/MathPow(10,digits),value)) 
      digits++;
   return(digits);
  }
//+------------------------------------------------------------------+
int DoubleToDigits(double value)
 {
   double absvalue=NormalizeDouble(fabs(value-int(value)),15);
   int res=StringLen(string(absvalue))-2;
   return(res<=0?0:res);
 }
//+------------------------------------------------------------------+
void OnStart()
  {
   double f = 122334550.007;
   Print("1. DoubleToDigits() = ",DoubleToDigits(f));
   Print("1. Digit() = ",Digit(f));
   f = 0.007;
   Print("2. DoubleToDigits() = ",DoubleToDigits(f));
   Print("2. Digit() = ",Digit(f));
  }  

结果。

2018.11.13 05:18:40.599 Digits (EURUSD,M1)      1. DoubleToDigits() = 11
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      1. Digit() = 3
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      2. DoubleToDigits() = 3
2018.11.13 05:18:40.599 Digits (EURUSD,M1)      2. Digit() = 3
 
我将把我从外汇赚来的钱投资在Jolly Trader酒吧。我将在伦敦开业。
 
Konstantin Gruzdev:

哦,对了,我忘了,这是在明知是小于零的数字的情况下做出的,因为它被用于批次规范化。修正了它,现在可以了。

结果。

没有,没有作用。

double f = 122334550.00999;

结果。

2018.11.13 02:36:31.034 tst (EURUSD,M30) 1.Digit() = 3


 
主啊,请给这些人的孩子学习物理的机会。
 
Igor Makanu:

不,这没有用。

哦,对了,我知道错在哪里了,我会改正的。

 
Алексей Тарабанов:
主啊,请给这些人的孩子学习物理的机会。

为什么,父母可以不做?

 

首先,回答你自己--为什么需要 知道小数点后有多少个数字?要做什么?

使用 "带数字的双倍数 "的唯一正确方法是,在要解决的问题中,事先 知道一些给定的 精度来使用它。

其他都是胡说八道。

我甚至不谈双数modulo的值越大,就越不准确,任何算法(尤其是字符串转换,那是超出范围的)都会失败。

 
Mesaoria:

(特别是转换为字符串,它是不符合规定的)会失败。

这些是MQL的代码,不是标准C++的代码,很明显,在C++中,字符串处理会很慢,在MQL中,内置函数比自写的函数更快。

 
Igor Makanu:

这是MQL的代码,不是标准C++的代码,很明显,在C++中,字符串处理会很慢,在MQL中,内置函数比自写函数更快。

我不是这个意思。将一个dule转换为一个字符串,然后计算其中的所有字符,这种想法简直是一派胡言。无论你做什么。

 
Mesaoria:

我说的根本不是这个意思。将一个dule转换为一个字符串,然后就可以计算字符串中的字符,这种想法完全是无稽之谈。无论你做什么。

是的,我的版本可能不是最好的,但由于我从来没有发现任何关于它的东西--这是我自己能想到的最好的,我在上面的评论中写了它,而你从来没有提出你自己的版本。