Chuẩn hóa số double
MQL5 API cung cấp một hàm để làm tròn các số dấu phẩy động đến một độ chính xác được chỉ định (số chữ số có nghĩa trong phần thập phân).
double NormalizeDouble(double number, int digits)
Việc làm tròn là cần thiết trong các thuật toán giao dịch để thiết lập khối lượng và giá trong đơn hàng. Việc làm tròn được thực hiện theo các quy tắc tiêu chuẩn: chữ số cuối cùng hiển thị được tăng thêm 1 nếu chữ số tiếp theo (bị loại bỏ) lớn hơn hoặc bằng 5.
Các giá trị hợp lệ của tham số digits
: từ 0 đến 8.
Ví dụ về việc sử dụng hàm này có sẵn trong tệp ConversionNormal.mq5
.
void OnStart()
{
Print(M_PI); // 3.141592653589793
Print(NormalizeDouble(M_PI, 16)); // 3.14159265359
Print(NormalizeDouble(M_PI, 8)); // 3.14159265
Print(NormalizeDouble(M_PI, 5)); // 3.14159
Print(NormalizeDouble(M_PI, 1)); // 3.1
Print(NormalizeDouble(M_PI, -1)); // 3.14159265359
...
}
2
3
4
5
6
7
8
9
10
Do thực tế là bất kỳ số thực nào cũng có độ chính xác biểu diễn nội bộ giới hạn, số có thể được hiển thị một cách gần đúng ngay cả khi được chuẩn hóa:
...
Print(512.06); // 512.0599999999999
Print(NormalizeDouble(512.06, 5));// 512.0599999999999
Print(DoubleToString(512.06, 5)); // 512.06000000
Print((float)512.06); // 512.06
}
2
3
4
5
6
Điều này là bình thường và không thể tránh khỏi. Để định dạng ngắn gọn hơn, hãy sử dụng các hàm DoubleToString
, StringFormat
hoặc ép kiểu trung gian sang (float)
.
Để làm tròn một số lên hoặc xuống đến số nguyên gần nhất, hãy sử dụng các hàm MathRound
, MathCeil
, MathFloor
(xem phần Các hàm làm tròn).