下午好
尽管我读了很多帮助部分,但我仍然搞不清楚最后的那个小数点1是哪里来的。
请记住,当使用Print()将一个规范化的数字输出到期刊时,它可能包含比你预期更多的小数位。比如说。
双重a=76。671;// 归一化的数字,小数点后3位
Print("Print(76.671)=",a);//按原样打印
Print("DoubleToString(a,8)=",DoubleToString(a,8));//以指定的精度打印。被输出到终端。
DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001
双重类型有精度限制,因此可能会出现错误。

- 2009.11.02
- MetaQuotes Software Corp.
- www.mql5.com
我看到了这个建议,谢谢你。
你可以在输出时使用DoubleToStr
但不清楚这句话首先从哪里来的!
如果我在做除法/乘法,好的,可以了,这是一个错误。
但在我自己规定的常量中?
事实证明,我必须对一个最初 不具备这种精度的常数使用四舍五入的方法
而最重要的是,对实际存储在双变量中的内容的信任被破坏了!
引自文件
Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.
例如,数字0.3和0.7在计算机中被表示为无限大的分数,而数字0.25则被准确地存储为2的幂。
但它仍然没有解释为什么下面的代码会出现00000001的尾巴
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 = "Positions closed at " + (string)current + " for portfolio: " + portfolio_name;
将Double转为String的电流,你就可以了。
是的,我已经意识到我们需要强制进行四舍五入。
NormalizeDouble 显然无法完成工作
下午好!
尽管我读了很多帮助部分,但我仍然搞不清楚最后的那个小数点1是哪里来的。