在MT4中通过NormalizeDouble对数字进行四舍五入 - 页 4 1234567891011...17 新评论 Lilita Bogachkova 2016.02.22 09:26 #31 Dmitry Fedoseev: 这是因为它是0.6,所以0.5只能通过作弊获得。double v1 = 1.1234567;如果在任何数字中插入'v1',则表明它被正确地舍入为'i = 2'。 Dmitry Fedoseev 2016.02.22 09:28 #32 lilita bogachkova: 如果在任何数字中插入'v1',那么你可以看到,到'i=2'为止,一切都被正确地四舍五入了。 在i=2之后有错吗? Lilita Bogachkova 2016.02.22 09:34 #33 Ihor Herasko:当只有一个数字被规范化时,很简单:0、1、2、3、4 -> 0,5、6、7、8、9 -> 1。当两位数被规范化时,两位数被考虑在内:0 - 49 -> 0,50 - 99 -> 1。毕竟,如果数字1.49必须被四舍五入为整数,我们真的要得到2,也就是51个百分点与1的可用49个百分点的距离吗?三位数、四位数等都是如此。但1.45被四舍五入为2,但前提是它之前已经被归一化为更高一级的精度。void OnStart() { for(int i=7;i>=0;i--) { double v1 = 1.4545454; double v2 = NormalizeDouble(v1,i+1); v1=NormalizeDouble(v1,i); v2=NormalizeDouble(v2,i); Print("v1 = ",i," = ",DoubleToString(v1,7),", v2 = ",i," = ",DoubleToString(v2,7)); } Print("---"); }v1 = 0 = 1.0000000, v2 = 0 = 2.0000000v1 = 1 = 1.5000000, v2 = 1 = 1.5000000v1 = 2 = 1.4500000, v2 = 2 = 1.4600000v1 = 3 = 1.4550000, v2 = 3 = 1.4550000事实证明,如果在计算中把这个数字归一到较高的精度,并在随后的计算中把这个数字归一到较低的精度,将导致与简单地把这个数字归一到较低的精度不同。 Ihor Herasko 2016.02.22 10:16 #34 lilita bogachkova:事实证明,如果在计算中,数字被归一到较高的精度,而在随后的计算中,数字被归一到较低的精度,其结果与仅仅把数字归一到较低的精度是不同的。 以上这种行为被称为 "作弊"))数学虽然是一门精确的科学,但仍然必须在理解的基础上加以应用。2+3=5,但如果2个桶加3只鸡,那么5就不行了 )) [删除] 2016.02.24 08:44 #35 对不起,但你如何获得你想要的价值?如果我使用推荐的功能,那么。- 在一个案例中,我得到了正确的四舍五入值0.06-0.02=NormalizeDouble(0.0399999999999,2) =0.04 除法是近似的,需要归一化。- 在第二种情况下,我也得到了四舍五入,但在这种情况下不需要0.06-0.024= NormalizeDouble(0.036,2) =0.04 这里不需要规范化(四舍五入)。但我怎样才能将其归一化而不是四舍五入呢? Ihor Herasko 2016.02.24 09:08 #36 Roman Starinskij:对不起,但你如何获得你想要的价值?为此,只值得制定什么是 "正确的价值观"。))如果我使用推荐的功能,那么。- 在一个案例中,我得到了一个适当的四舍五入的值0.06-0.02= NormalizeDouble(0.039999999999999,2) =0.04 除法是近似的,你不能不进行归一化。- 在第二种情况下,我也得到了四舍五入,但在这种情况下不需要。0.06-0.024= NormalizeDouble(0.036,2) =0.04 这里不需要归一化(四舍五入)。但我如何正确地进行归一化,而不是四舍五入?上面的例子表明,你在使用一些直观的算法来确定规范化的 "正确性"。在第一种情况下,它是一个无限的分数,而在第二种情况下,它是一个有限的分数。调整你的算法,将实数转换为所需的形式。虽然最简单的方法是--提前决定所需的计算精度。 [删除] 2016.02.24 14:23 #37 Ihor Herasko:要做到这一点,只需要制定什么是 "正确的价值观 "就可以了))从上面的例子中,你可以看到,你正在使用一些直观的算法,通过这些算法来确定规范化的 "必要性"。在第一种情况下,它是一个无限的分数,而在第二种情况下,它是一个有限的分数。调整你的算法,将实数转换为所需的形式。虽然最简单的方法是提前决定你需要的精度。我只需要得到同样的数字,而我以前是在计算器中得到的。:-)这些是你需要的价值。因此,用 "0.06-0.02 "可以得到 "0.04",用 "0.06-0.024 "可以得到 "0.036"。 Dmitry Fedoseev 2016.02.24 14:29 #38 Roman Starinskij: 我只需要得到我习惯于在计算器中得到的相同数字。:-)这些是你需要的价值。如果你想要 "0.06-0.02",你会得到 "0.04",如果你想要 "0.06-0.024",你会得到 "0.036"。 如果你想得到0.036(小数点后3位),你需要归一化到小数点后3位,而不是2位。 [删除] 2016.02.24 17:08 #39 Dmitry Fedoseev: 如果你想要0.036(小数点后3位),请将其规范化为3,而不是2。我错了,3位以内的数字应该是正常化的。有可能做到这一点吗? Dmitry Fedoseev 2016.02.24 17:33 #40 Roman Starinskij:我错了,3位以内的数字应该是正常化的。这样做行得通吗?这是你的代码。0.06-0.024 = NormalizeDouble(0.036,2) = 0.04 与其说是2,不如说是3,那就是0.036。 1234567891011...17 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这是因为它是0.6,所以0.5只能通过作弊获得。
如果在任何数字中插入'v1',则表明它被正确地舍入为'i = 2'。
如果在任何数字中插入'v1',那么你可以看到,到'i=2'为止,一切都被正确地四舍五入了。
当只有一个数字被规范化时,很简单:0、1、2、3、4 -> 0,5、6、7、8、9 -> 1。
当两位数被规范化时,两位数被考虑在内:0 - 49 -> 0,50 - 99 -> 1。毕竟,如果数字1.49必须被四舍五入为整数,我们真的要得到2,也就是51个百分点与1的可用49个百分点的距离吗?
三位数、四位数等都是如此。
但1.45被四舍五入为2,但前提是它之前已经被归一化为更高一级的精度。
v1 = 0 = 1.0000000, v2 = 0 = 2.0000000
v1 = 1 = 1.5000000, v2 = 1 = 1.5000000
v1 = 2 = 1.4500000, v2 = 2 = 1.4600000
v1 = 3 = 1.4550000, v2 = 3 = 1.4550000
事实证明,如果在计算中把这个数字归一到较高的精度,并在随后的计算中把这个数字归一到较低的精度,将导致与简单地把这个数字归一到较低的精度不同。
事实证明,如果在计算中,数字被归一到较高的精度,而在随后的计算中,数字被归一到较低的精度,其结果与仅仅把数字归一到较低的精度是不同的。
对不起,但你如何获得你想要的价值?
如果我使用推荐的功能,那么。
- 在一个案例中,我得到了正确的四舍五入值
0.06-0.02=NormalizeDouble(0.0399999999999,2) =0.04
除法是近似的,需要归一化。
- 在第二种情况下,我也得到了四舍五入,但在这种情况下不需要
0.06-0.024= NormalizeDouble(0.036,2) =0.04
这里不需要规范化(四舍五入)。
但我怎样才能将其归一化而不是四舍五入呢?
对不起,但你如何获得你想要的价值?
为此,只值得制定什么是 "正确的价值观"。))
如果我使用推荐的功能,那么。
- 在一个案例中,我得到了一个适当的四舍五入的值
0.06-0.02= NormalizeDouble(0.039999999999999,2) =0.04
除法是近似的,你不能不进行归一化。
- 在第二种情况下,我也得到了四舍五入,但在这种情况下不需要。
0.06-0.024= NormalizeDouble(0.036,2) =0.04
这里不需要归一化(四舍五入)。
但我如何正确地进行归一化,而不是四舍五入?
上面的例子表明,你在使用一些直观的算法来确定规范化的 "正确性"。在第一种情况下,它是一个无限的分数,而在第二种情况下,它是一个有限的分数。调整你的算法,将实数转换为所需的形式。
虽然最简单的方法是--提前决定所需的计算精度。
要做到这一点,只需要制定什么是 "正确的价值观 "就可以了))
从上面的例子中,你可以看到,你正在使用一些直观的算法,通过这些算法来确定规范化的 "必要性"。在第一种情况下,它是一个无限的分数,而在第二种情况下,它是一个有限的分数。调整你的算法,将实数转换为所需的形式。
虽然最简单的方法是提前决定你需要的精度。
如果你想要0.036(小数点后3位),请将其规范化为3,而不是2。
我错了,3位以内的数字应该是正常化的。有可能做到这一点吗?
我错了,3位以内的数字应该是正常化的。这样做行得通吗?
这是你的代码。
与其说是2,不如说是3,那就是0.036。