Double vs FLOAT - 不明确的MathFloor错误 - 页 4

 
Andrey Dik:
漂浮是对数字的阉割,没有任何好处。最好是处理转换中的所有损失,并使用尽可能高的精度--两倍。
谢谢你。我将努力找出我在哪里犯了错误。目前,浮筒也仍在工作。我没有放弃我已经开始的东西的习惯。但这个错误使我失去了平衡。
 
Vladislav Andruschenko:
谢谢你。我会试着找出我的错误所在。同时,漂浮物正在发挥作用。我不习惯于辞职。但是这个错误让我大吃一惊。
这取决于你,但请注意,所有的标准数学函数都是以双倍的数字工作,并产生双倍的结果。对浮点数应用这些函数会产生内部转换为双数,所以无论如何你都会失去精度和结果的有效性。

就我个人而言,我在计算和比较数字时从不使用与一些最小的可接受值相比较的方法,我总是以最大可能的准确性来工作,直到第16个符号,只有在最后的操作中我才做归一化。如果你正确地处理双倍,就没有问题,我建议你这样做,否则你会遇到在计算/转换的某个步骤中失去准确性 而导致结果失真的问题。
 
Andrey Dik:
这取决于你,但请注意,所有的标准数学函数都是与双数一起工作的,并给出双数结果。对浮点数应用这些函数仍然是对双数的内部转换,所以在任何情况下,你都会失去得到的结果的准确性和有效性。

就我个人而言,我在计算和比较数字时从不使用与一些最小的可接受值相比较的方法,我总是以最大可能的准确性来工作,直到第16个符号,只有在最后的操作中我才做归一化。如果你正确地使用双倍数,就不会有问题,我建议你这样做,否则你会遇到与计算/转换的某个步骤中的精度损失 有关的结果失真问题。
谢谢你的全面回答。
 

2017年的评级价格是不折不扣的正确。

不是飞蛾,是粪便......

 
Mikhail Dovbakh:

2017年的评级价格是不折不扣的正确。

告诉我们。
 

那是应该的

double Averab=(Ask+Bid)/2/_Point;
double AUTOPRICE=MathFloor( NormalizeDouble(Averab,2) )*_Point;
 
Taras Slobodyanik:

它应该是这样的。

double Averab=MathAbs(Ask-Bid)/2/_Point;
double AUTOPRICE=MathFloor( NormalizeDouble(Averab,2) )*_Point;


你的代码已经改了好几次了。

我也做过同样的事情,我做过实验,我明白什么是double和int,但当我明确计算时,它们不是我需要的。

第一行是你建议的内容。

MathFloor( NormalizeDouble((Ask+Bid)/Point,_Digits) )*Point
2017.02.26 18:24:59.133 2017.01.02 00:03:00  Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: MathFloor=2.10287
2017.02.26 18:24:59.133 2017.01.02 00:03:00  Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: DOUBLE    askP2=105146 bidP2=105141 Averab2=105143.5000000000 AUTOPRICE=1.0514300000
2017.02.26 18:24:59.133 2017.01.02 00:03:00  Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: FLOAT    askP=105146 bidP=105141 Averab=105143.5000000000 AUTOPRICE=1.0514299870
 

所以,这是正确的105143.5000000000 向下四舍五入43是......

(46-41)/2=2.5,四舍五入=2

 
Taras Slobodyanik:

因此,这是正确的105143.5000000000,四舍五入为43...

(46-41)/2=2.5,四舍五入=2


这就对了。

但不同的价差(2,3,4,5,6,7),向下的四舍五入是不同的,有时不大准确。

 
检查了从0到8,一切正常......