double MyNormalizeDouble(double value, int digits)
{
int factor = MathRound( MathPow(10, digits) ); // factor - это множитель,
с помощью которого мы из VALUE сделаем целое число
double result = MathRound(factor * value) / factor;
return(result);
}
double a;
double b;
int factor = MathRound( MathPow(10, digits) ); // digits - это точность с которой будем сравнивать
Если сравниваем цены, то это предопределенная переменная Digits
...
if (MathRound( (а - b) * factor ) != 0)
{
... // a != b
}
if (MathRound( (а - b) * factor ) == 0)
{
... // a == b
}
if (MathRound( (а - b) * factor ) > 0)
{
... // a > b
}
if (MathRound( (а - b) * factor ) < 0)
{
... // a < b
}
double a;
double b;
int factor = MathRound( MathPow(10, digits) ); // digits - это точность с которой будем сравнивать
Если сравниваем цены, то это предопределенная переменная Digits
...
if (MathRound( (а - b) * factor ) != 0)
{
... // a != b
}
if (MathRound( (а - b) * factor ) == 0)
{
... // a == b
}
if (MathRound( (а - b) * factor ) > 0)
{
... // a > b
}
if (MathRound( (а - b) * factor ) < 0)
{
... // a < b
}
惊人的结论!如果你甚至根本不 "理解 "什么是数字,你怎么会对任何数字有这种想法?
惊人的结论!如果你甚至根本不 "理解 "什么是数字,你怎么会对任何数字有这种想法?
我应该马上说,我宁愿不参与这样的解释,因为如果你对案情没有什么可说的,为什么还要说话?
我想感谢所有专家的见解!
Irtron, 我选择了你的变体,我非常喜欢它。我针对一般情况稍加修正,并进行了检查。
int ComparePrice(double a, double b, double digit)
{
a -= b。
b = 数字。
如果(a>b)
返回(1)。
如果(a < -b)
返回(-1)。
返回(0)。
}
谢谢。
double digit14=0.00000000000001;
双位数12=0.000000000001。
双位数8=0.00000001。
双位数4=0.0001。
double digit2=0.01。
这将决定所需的精度。
对于这种功能,它的工作速度非常快。
Irtron, 再次感谢。
惊人的结论!如果你甚至根本不 "理解 "什么是数字,你怎么会对任何数字有这种想法?
我应该马上说,我宁愿不参与这样的解释,因为如果你对案情没有什么可说的,为什么还要说话?
为什么要挑剔,我只是读了你写的东西。 你的理解显然受到了 "你公然的...(你说说看)"
VBAG,既然有一个函数NormalizeDouble()可以比ComparePrice()更快地比较两个数字,为什么还要重新发明车轮呢?
VBAG,既然有一个NormalizeDouble()函数可以比ComparePrice()更快地比较两个数字,为什么还要重新发明车轮呢?
如果你能建议类似的自行车或更好的替代解决方案,我将很乐意使用它们。
恭敬地说。
弗拉基米尔
VBAG,既然有一个NormalizeDouble()函数可以比ComparePrice()更快地比较两个数字,为什么还要重新发明车轮呢?
如果你能建议一个类似的轮子或更好的替代品,我很乐意使用它们。
恭敬地说。
弗拉基米尔
2007.09.12 07:15:09 $CheckCompareDouble USDJPY,M5: CD: 20485, xNormalize: 51265
结论。
CD函数比较两个双数,给出小数点后14位的答案<, >或=,并且比简单执行NormalizeDouble()快2倍(即使没有逻辑比较)。
许多人写道,为了进行比较,必须使用内置函数NormalizeDouble()。(这也是开发人员的建议)。
因此,我想首先定义一下。"什么是NormalizeDouble()?",也就是说,它是如何工作的,它的算法是什么。
将一个浮点数舍入到指定的精度。
...
我不知道在MQL4中是如何组织四舍五入的(问开发人员),但我知道一个标准的方法 将浮点数舍入到指定的精度。
在这里,一个函数。
从这个函数你可以看到,我们首先从一个实数变成一个整数,然后再回到一个实数。
为了进行比较,只需要去找一个整数就可以了。
因此,我认为比较实数的最快和最可靠的方法是将它们转换为整数。
这就是对比结果的模样。
所有这些都可以被格式化为一个函数并使用。写起来很麻烦,似乎很清楚如何做一个函数!
我认为这种方式比调用NormalizeDouble()更快。
为了安全起见,你也可以让MathRound()函数返回一个整数,因为默认情况下它会返回双数。
最简单的方法是这样做的
那么只有整数会被比较,而且比较得很好!
我认为这种方式是最正确的,你认为呢?
所以我认为最快速和最可靠的方法是将实数转换成整数
比较结果将是这样的。
我认为这才是正确的做法,不是吗?
Irtron 代码的全部优点在于它的紧凑性(绝对没有多余的东西--甚至变量也被保存了!)。
而你建议我们至少应该为每一个 操作增加两个操作。
这是一个速度上的优势!
我不这么认为。自己判断