双精度浮点数的规范化

MQL5 API 提供了用于将浮点数字舍入为指定精度(小数部分有效数位数)的函数。

double NormalizeDouble(double number, int digits)

交易算法中需要舍入以设置 订单中的交易量和价格。根据标准规则执行舍入:如果下一位(舍弃的)数字大于或等于 5,则最后可见数字增加 1。

digits 参数的有效值:0 至 8。

该函数的使用示例在 ConversionNormal.mq5 文件中提供。

void OnStart()
{
   Print(M_PI);                      // 3.141592653589793
   Print(NormalizeDouble(M_PI16)); // 3.14159265359
   Print(NormalizeDouble(M_PI8));  // 3.14159265
   Print(NormalizeDouble(M_PI5));  // 3.14159
   Print(NormalizeDouble(M_PI1));  // 3.1
   Print(NormalizeDouble(M_PI, -1)); // 3.14159265359
   ...

由于任何实数均具有有限的 内部表示 精度,因此即使规范化后,数字也可能是近似显示:

   ...
   Print(512.06);                    // 512.0599999999999
   Print(NormalizeDouble(512.065));// 512.0599999999999
   Print(DoubleToString(512.065)); // 512.06000000
   Print((float)512.06);             // 512.06
}

这是正常情况,无法避免。要获得更紧凑的格式,可使用 DoubleToStringStringFormat 函数或以中间方式强制转换为 (float)

要将一个数字舍入为最近整数,使用 MathRoundMathCeilMathFloor 函数(参见章节 舍入函数)。