Нормализация чисел double

MQL5 API предоставляет функцию для округления чисел с плавающей точкой до указанной точности (количества значащих цифр в дробной части).

double NormalizeDouble(double number, int digits)

Округление требуется в торговых алгоритмах для задания объема и цен в приказах. Округление производится по стандартным правилам: последний видимый разряд увеличивается на 1, если следующий (отбрасываемый) разряд больше или равен 5.

Допустимые значения параметра 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
}

Это нормальное, неизбежное явление. Для более компактного форматирования используйте функции DoubleToString, StringFormat или промежуточное приведение к (float).

Для округления числа до ближайшего целого вверх или вниз используйте функции MathRound, MathCeil, MathFloor (см. раздел Функции округления).