좋은 오후에요!
도움말의 이 섹션을 아무리 많이 읽어도 모든 것을 이해할 수는 없습니다. 글쎄, 이 소수 부분은 끝에서 어디에서 왔는지 ???
Print()를 사용하여 저널에 인쇄할 때 정규화된 숫자는 예상보다 더 많은 소수 자릿수 를 포함할 수 있습니다. 예를 들어,
이중 a=76.671; // 소수점 이하 3자리의 정규화된 숫자
Print( "인쇄(76.671)=" ,a); // 그대로 표시
Print( "DoubleToString(a,8)=" ,DoubleToString(a,8)); // 주어진 정밀도로 출력터미널에서 제공:
DoubleToString(a,8)=76.67100000
인쇄(76.671)=76.67100000000001
Double 유형은 정밀도에 제한이 있어 오류가 발생할 수 있습니다.
이 기사를 추천합니다: https://www.mql5.com/en/articles/1561
![Особенности работы с числами типа double в MQL4 Особенности работы с числами типа double в MQL4](https://c.mql5.com/36/6/osobennosti-raboti-s-chislami-tipa.png)
- 2009.11.02
- MetaQuotes Software Corp.
- www.mql5.com
추천은 명확합니다, 감사합니다
출력할 때 DoubleToStr을 사용할 수 있습니다.
그러나 이것이 어디에서 왔는지 명확하지 않습니다!
나누기/곱셈을 하면 OK, 분명히 오류가 발생합니다.
하지만 일정하게? 내가 직접 쓴?
처음 에는 이 정밀도가 없는 상수에 반올림을 사용해야 합니다.
그리고 가장 중요한 것은 실제로 이중 변수에 저장된 내용의 신뢰성이 훼손된다는 것입니다!
문서 에서 인용
Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.
예를 들어, 숫자 0.3과 0.7은 컴퓨터에서 무한 분수로 표시되는 반면 숫자 0.25는 정확히 2의 거듭제곱으로 저장됩니다.
여전히 이것은 꼬리 0000000001이 아래 코드에서 발행되는 이유를 설명하지 않습니다.
current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);
text = "Positions closed at " + (string)current + " for portfolio: " + portfolio_name;
if(!automatic) MessageBox(text,""); else Print(text);
정규화를 했기 때문에
그러나 숫자에는 여전히 꼬리가 있습니다.
text = "포트폴리오의 경우 " + (문자열)현재 + "에서 마감된 포지션: " + 포트폴리오 이름;
여기에서 현재에 대해 DoubleTo String을 수행해야 하며 모든 것이 잘 될 것입니다.
예, 반올림을 강제해야 한다는 것을 이미 이해했습니다.
NormalizeDouble 이 작업에 적합하지 않은 것 같습니다.
좋은 오후에요!
도움말의 이 섹션을 아무리 많이 읽어도 모든 것을 이해할 수는 없습니다. 글쎄, 이 소수 부분은 끝에서 어디에서 왔는지 ???