返回负值的位置大小 - 页 3

 
JD4:

以上是对你的具体帖子"MathRound返回一个双数;无限的小数位。"

再一次,根据文档页的内容。

"返回值

四舍五入到最接近的整数的值。"

现在,具体回应你帖子的这一部分。

"页面上所说的,就是它所做的。它是四舍五入的。与多个小数位的问题无关。"

再说一遍,重读这段话,它说它返回"四舍五入到最接近的整数"。 根据定义,整数是一个整数,没有小数位。 再说一遍,如果这不是它实际做的,那么代码或描述就有问题,其中一个或另一个或两者都需要由MQ修复,否则就需要一个警告标签,说明这些函数没有像宣传的那样执行。

如果它实际上返回它所给的类型,但在数学上相当于最接近的整数的值(如从1.23456返回1.00000,而1==1.00000),但不返回实际的整数类型,那么参考页需要指定一些东西,如 "不改变基础数据类型 "或其他一些明确说明的方式。 我认为这是一个从俄罗斯原始页面平移的翻译,因此,在英语中不像它应该那样清楚。

MetaQuotes的文档充其量是很弱的。

然而,既然如此,MathRound() 根据定义返回一个双数。

如果返回的值是"值除以2",它仍然是一个双数。

同样,"数值四舍五入到最接近的整数 "仍然是一个双数。

希望这有帮助

 
honest_knave:

MetaQuotes的文档充其量是很弱的。

然而,既然如此,MathRound() 根据定义返回一个双数。

如果返回的值是"值除以2",它仍然是一个双数。

同样,"数值四舍五入到最接近的整数 "仍然是一个双数。

希望这对你有帮助

对我来说,"数值四舍五入到最近的整数 "并不清楚它返回的不是整数,因为整数的定义是这样的。 我明白它实际上是这样工作的,但这强调了我的观点,即代码和/或官方页面的措辞是错误的,需要修复。 要么代码需要调整,以便它确实返回int类型,要么页面的措辞需要改变。 我们作为用户没有办法做到这一点。你得到的四舍五入的值不会改变,除非你把它赋值给那个变量。 就像如果你用1.3的值四舍五入y,并把它放在x中,使用上面的措辞,在函数完成后,你会期望y仍然包含1。在我的脑海中,以及我的理解中,四舍五入意味着你要四舍五入到最接近的项目,而不是等同于该项目的值。 也许 "在翻译中丢失的东西 "这句话在这里非常合适。
 
JD4:
对我来说,"Value rounded till to the nearest integer "并不清楚它返回的不是整数,因为整数的定义是这样的。 我知道它实际上是这样工作的,但这强调了我的观点,即代码和/或官方页面的措辞是错误的,需要修复。 要么代码需要调整,以便它确实返回int类型,要么页面措辞需要改变。 我们作为用户没有办法这样做。你得到的四舍五入的值不会改变,除非你把它赋值给那个变量。 就像如果你用1.3的值四舍五入y,并把它放在x中,使用上面的措辞,在函数完成后,你会期望y仍然包含1。在我的脑海中,以及我的理解中,四舍五入意味着你要四舍五入到最接近的项目,而不是等同于该项目的值。 也许 "在翻译中丢失的东西 "这句话在这里非常合适。

我不是一个文档的粉丝,但我不得不说,我认为他们在这方面是一致的。所有的文档都在页面顶部列出了返回的数据类型(int, double, bool等),后面的返回值部分从来没有重复过这个数据类型。另外,在这种情况下,他们返回的数据类型与被放入的数据类型完全相同。

无论如何,如果你使用#property strict编译器指令,你应该得到一个警告。

 
honest_knave:

我不是一个文档的粉丝,但我不得不说,我认为他们在这方面是一致的。所有的文档都在页面顶部列出了返回的数据类型(int, double, bool等),后面的返回值部分从来没有重复过这个数据类型。另外,在这种情况下,他们返回的数据类型与被放入的数据类型完全相同。

在任何情况下,如果你使用#property strict编译器指令,你应该得到一个警告。


我已经在MQL5.com论坛上发起了一个主题,网址是https://www.mql5.com/en/forum/61394,希望能最终帮助解决这个文档问题。也许如果我们有足够多的人支持这个想法,MQ会让我们大家一起帮助解决到目前为止对很多人来说都是一个问题。 我希望MQ会同意这个想法,因为我们作为用户不能改变任何事情。

@ knave & WH - 我完全同意你的例子,但我仍然看到一个问题,我要么没有解释清楚,要么我是少数几个认为这是一个问题的人之一。 对我来说,你的例子证明了我对这个话题的看法,而不是你认为他们证明了你的看法。

knave,你的例子 返回一个错误,因为它没有返回它应该返回的数据类型,即int。 事实上,你把你的变量铸造为int,只是让我们更容易看到函数不能正常工作的问题。

WH,你指出了那一行(来自文档页),它说的和我强调的那一行基本上是一样的。 这个例子只用了一个双数作为被发送到 函数的值。 你的帖子中没有任何一个显示100%明确地说明 函数返回的数据类型是双数,只是说这个例子发送的是一个双数。

四舍五入一般被认为是将一个特定数字的值改为较低的精度。 我想在这一点上我们都可以达成共识。

在这种情况下,也没有什么不同。 该页规定 "四舍五入到指定数值的最近的整数"。 它的意思是它将从另一个数值四舍五入到一个较小的精度(int)。 在所用的例子中,发送的是一个双数。 这就是所有100%清楚的内容。

 

对不起,JD4,你完全把我弄糊涂了......

JD4:

你的帖子中没有一个显示100%明确地说明 函数 返回的数据类型是一个双数,只是说明这个例子是发送一个双数。

这正是我用箭头标注的内容。它返回的是一个双数(大的红色箭头),传递的参数也是一个双数(在我的箭头下面)。看一下任何一个函数。OrderSend() 返回一个int...OrderClose() 返回一个bool....,MathRound() 返回一个双数

JD4

knave,你的例子 返回一个错误,因为它没有返回它应该返回的数据类型,一个int。 事实上,你把你的变量铸成一个int,只是让我们更容易看到函数不能正常工作的问题。

该函数的工作原理与广告中的完全一致。

如果你认为它是一个int(错误),你会得到这个结果。

如果你把它类型化为int,你就承认你使用了错误的数据类型。

如果你把它当作一个双数(它就是),你就没有警告。

 
honest_knave:

对不起,JD4,你完全把我弄糊涂了......

这正是我用箭头标出的内容。它返回的是一个双数(大的红色箭头),传递的参数也是一个双数(在我的箭头下面)。看一下任何一个函数。OrderSend() 返回一个int...OrderClose() 返回一个bool....,MathRound() 返回一个双数

该函数的工作原理与广告中的完全一致。

如果你认为它是一个int(错误),你会得到这个。


如果你把它类型化为int,你会承认你使用了错误的数据类型。


如果你把它当作一个双数(它就是),你就不会有任何警告。

这个例子是通过类型转换来返回双倍数的。 在你的int RoundedNumber的代码例子中,你是通过类型转换来返回int作为返回类型的。 这应该是没有必要的,因为根据页面上的内容,它应该返回一个int。 顶部的一行和返回值中的一行说它四舍五入为一个指定值的整数。一个整数,不管我们怎么说,都没有任何小数位、分数或任何其他表示整数、零和负整数之间的数字的方式。 正如我上面发布的例子,根据给出的文档,发送MathRound函数 "1.3 "应该返回 "1",而不是 "1.0",因为 "1.0 "不是一个整数,但 "1 "是。(引号只是为了说明问题)

如果你把它当作一个双数(它可能是,但不应该是),那么这只是让这个不正确的函数继续操作,与它的文档所规定的操作相悖,即返回一个从发送到它的值(即双数)中取整的整数。

将一个双数送入四舍五入(现在代码的编写方式)到一个整数,然后将返回的值铸造或存储为一个双数类型,不会产生错误,因为它应该返回一个int,如果你将一个int存储为一个双数,你不会在转换中损失任何精度。如果你将一个双倍数存储为一个int,你将期待一个像你所显示的错误,因为你强迫它变成另一种形式,其精度比以前的要低。

如果MathRound函数不应该返回整数,那么就需要修改页面上的措辞,使其不说应该返回整数。 我的问题从来都是关于这个函数所做的事情,除了它与页面上所说的应该做的事情相悖之外。他们需要修正这个函数的代码,使它像文档页所说的那样返回一个int,或者编辑文档页以反映它不一定返回一个int。"四舍五入到最接近的整数 "正是如此,一个整数。

编辑:我通过C++和Java的参考资料做了进一步的研究,因为MQL在某种程度上是基于C++的,并且在语法上与Java和C++相似。C++在文档的一个部分(http://www.cplusplus.com/reference/cmath/round/) 显示"Round to nearest 返回与x最接近的积分值,半途而废。" 但在页面的后面,它说"Return Value 将x的值舍入到最近的积分(作为一个浮点值)。" 你可能会说这支持了你的观点,但事实上它并不支持,因为C++规定它返回一个浮点数。Java文档在http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html,显示了以下两个名为round的方法。 这两个(Java和C++)在其语言中的功能等同于MathRound和/或MQL中的round函数。

static long round(double a)
返回与参数最接近的长数,并四舍五入。
static int round(float a)
返回与参数最接近的int,并向上舍入。
 

MQL MathRound在一个浮动数据类型中返回一个整数值。当然,C++或Java的四舍五入函数 做什么是不相关的。如果你想要的话,在MQL中写你自己的 "int round(double a) "函数是很容易的。

(32位)浮点数可以很好地容纳(16位)整数而不损失精度。问题是,OP希望数值被四舍五入到小数点后两位,并希望它是精确的。这是不可能的。

 
ydrol:

MQL MathRound在一个浮动数据类型中返回一个整数值。当然,C++或Java的四舍五入函数做什么是不相关的。如果你想要的话,在MQL中写你自己的 "int round(double a) "函数是很容易的。

(32位)浮点数可以很好地容纳(16位)整数而不损失精度。问题是,OP希望数值被四舍五入到小数点后两位,并希望它是精确的。这是不可能的。

我的帖子偏离了主题,特别是关于函数以某种方式运行的问题,我已经不再发表这种偏离主题的讨论。 如果这个函数的讨论最终转移到其他地方,我也无所谓。

编辑:我在https://www.mql5.com/en/forum/156174,为继续讨论这个冲突的文档页开了一个主题 Gum,我已经在这个主题上回复了你下面的帖子。
 

JD4,你似乎是唯一一个对此感到困惑的人

HonestKnave已经指出,文档清楚地表明,该函数 返回一个双数。一个整数表示为一个双数。

"四舍五入到最接近的整数 "并不意味着它被转换为一个整数。

如果我告诉你把一块木头切成与一根绳子相同的长度。木头仍然是木头,它不会突然变成一段字符串。

 
JD4:

顶部的一行和返回值中的一行说它四舍五入到指定值的整数。

JD4:

你需要修改这个函数的代码,使它像文档页所说的那样返回一个整数,或者编辑文档页以反映它不一定返回一个整数。"四舍五入到最接近的整数 "正是如此,一个整数。


好吧,我不知道什么能说服你JD4。文档清楚地、百分之百地指出,该函数返回一个双数。你是在对返回值的描述中读出了别的东西--它从来没有说过它返回的是一个整数。

当你看OrderSend()时,它说 "返回的值。返回交易服务器分配给订单的票据号码,如果失败则返回-1。要获得额外的错误信息,必须调用GetLastError()函数。"

那么,它的数字是什么意思?这有点模糊,你不觉得吗?他们是指双数、浮点数、图表、短、英特、长吗?答案就在页面的顶部,就像我之前发布的那个大箭头。那是他们的标准格式,你可以在那里看到返回的数据类型。(注意我没有说返回的数据)。我真的想不出文档中的任何一个例子,"返回值 "部分曾经提到过数据类型