用以下代码测试出Floor函数bug,望尽快解决,谢谢!!!
// 简称: Testing
// 名称: Testing
// 类别: 公式应用
// 类型: 用户应用
// 输出:
//------------------------------------------------------------------------
Vars
Numeric HH1;
Numeric LL1;
Numeric HH2;
Numeric LL2;
Numeric ML1;
Numeric ML2;
Numeric Test1;
Numeric Test2;
Numeric V2;
Begin
HH1=781.5;
LL1=760.5;
ML1=0.5*(HH1+LL1);
Test1=Floor(ML1,MinMove*PriceScale);
HH2=782;
LL2=760.5;
ML2=0.5*(HH2+LL2);
Test2=Floor(ML2,MinMove*PriceScale);
V2=771;
Commentary( MinMove*PriceScale = +Text(MinMove*PriceScale) );
Commentary( ML1 = +Text(ML1) );
Commentary( Floor(ML1,MinMove*PriceScale) = +Text(Test1) );
Commentary( ML2 = +Text(ML2) );
Commentary( Floor(ML2,MinMove*PriceScale) = +Text(Test2) );
Commentary( V2 = +Text(V2) );
If (V2>=Test2) Commentary(V2>=Floor(ML2,MinMove*PriceScale)可以为True);
Else Commentary(V2>=Floor(ML2,MinMove*PriceScale)不能为True);
End
这个其实是浮点数精度的问题....
建议把所有小数都放大成整数,然后以整数点取
比如771,0.5取floor,转成7710,5取floor,最后计算结果再除以10。
因为计算机计算小数是有截断误差的,所以能不能浮点数计算,尽量不要用。
做了更多的测试,发现问题在minmove*pricesacle上,不在floor()上。对于铁矿石,floor(V,0.5)可以得到正确结果,floor(V,minmove*pricesacle)就会有问题,虽然minmove*pricesacle的输出也是0.5。
不是函数问题,就是浮点数运算的截断误差问题,这个很随机。
有兴趣可以自己搜索学习一下相关内容。
作为计算机程序员的其中一个共识,就是运算尽量用整型,不要用浮点数。
举个例子,如果你要计算0.3*0.5,程序员会建议你把算式变形,分成两步,先计算3*5然后第二步再除以100.这样计算比直接0.3*0.5,准确率更高