归一化的双重悖论

 

下午好!

尽管我读了很多帮助部分,但我仍然搞不清楚最后的那个小数点1是哪里来的。

请记住,当使用Print()将一个规范化的数字输出到Journal时,它可能包含比你预期更多的小数位。比如说。

双重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

 
transcendreamer:

下午好

尽管我读了很多帮助部分,但我仍然搞不清楚最后的那个小数点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

双重类型有精度限制,因此可能会出现错误。

我推荐这篇文章:https://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • 2009.11.02
  • MetaQuotes Software Corp.
  • www.mql5.com
В данной заметке собраны советы по решению наиболее часто возникающих ошибок при работе с числами типа double в программах на MQL4.
 
ENSED:

双重类型在精度上有局限性,会导致错误。

我推荐这篇文章:https://www.mql5.com/ru/articles/1561

我看到了这个建议,谢谢你。

你可以在输出时使用DoubleToStr

但不清楚这句话首先从哪里来的!

如果我在做除法/乘法,好的,可以了,这是一个错误。

但在我自己规定的常量中?

事实证明,我必须对一个最初 不具备这种精度的常数使用四舍五入的方法

而最重要的是,对实际存储在双变量中的内容的信任被破坏了!

 

引自文件

Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.

例如,数字0.3和0.7在计算机中被表示为无限大的分数,而数字0.25则被准确地存储为2的幂。

 
stringo:

引自文件

有趣的是...

我已经在猜测,它不在MQL中,而是在更深的地方,在80年代的标准层面上。

但仍然非常奇怪...

我没有在任何其他应用语言中见过它。

在MQL语言层面上有一些变通方法是合理的

 

但它仍然没有解释为什么下面的代码会出现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);

因为我做了规范化处理

而这个数字仍然是尾数。

 
transcendreamer:

有趣的是...

我已经在猜测,这不是关于MQLs的问题,而是在80年代标准的某个更深层次的地方。

但它仍然非常奇怪...

我没有在任何其他应用语言中看到这种情况

在MQL的层面上有一些变通方法是合理的。

这有什么难的?

如果你需要精确到4位数。用这个数字乘以10000,丢掉小数部分,再除以10000。

mql的数学功能可以在文档中找到。

 

text = "Positions closed at " + (string)current + " for portfolio: " + portfolio_name;

将Double转为String的电流,你就可以了。

 

是的,我已经意识到我们需要强制进行四舍五入。

NormalizeDouble 显然无法完成工作

 
transcendreamer:

是的,我已经意识到我们需要强制进行四舍五入。

NormalizeDouble似乎没有完成工作

NormalizeDouble正是它的工作方式(从第一个MQL开始,一直是这样工作的)。

一个数字乘以10的数字幂,转换成整数形式(放弃小数部分),然后除以10的数字幂。

问题是什么?打破模式?

 
stringo:

NormalizeDouble的工作方式是这样的(从第一个MQL开始就一直是这样工作的)

数字乘以10的幂,转换成整数形式(放弃小数部分),然后再除以10的幂。

问题是什么?打破模式?

一个模式的突破是,即使在归一化之后,也有尾巴!这是对的。