在MT4中通过NormalizeDouble对数字进行四舍五入 - 页 4

 
Dmitry Fedoseev:
这是因为它是0.6,所以0.5只能通过作弊获得。

double v1 = 1.1234567;

如果在任何数字中插入'v1',则表明它被正确地舍入为'i = 2'。

 
lilita bogachkova:

如果在任何数字中插入'v1',那么你可以看到,到'i=2'为止,一切都被正确地四舍五入了。

在i=2之后有错吗?
 
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.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

事实证明,如果在计算中把这个数字归一到较高的精度,并在随后的计算中把这个数字归一到较低的精度,将导致与简单地把这个数字归一到较低的精度不同。


 
lilita bogachkova:

事实证明,如果在计算中,数字被归一到较高的精度,而在随后的计算中,数字被归一到较低的精度,其结果与仅仅把数字归一到较低的精度是不同的。


以上这种行为被称为 "作弊"))数学虽然是一门精确的科学,但仍然必须在理解的基础上加以应用。2+3=5,但如果2个桶加3只鸡,那么5就不行了 ))
[删除]  

对不起,但你如何获得你想要的价值?

如果我使用推荐的功能,那么。

- 在一个案例中,我得到了正确的四舍五入值
0.06-0.02=NormalizeDouble(0.0399999999999,2) =0.04
除法是近似的,需要归一化。

- 在第二种情况下,我也得到了四舍五入,但在这种情况下不需要
0.06-0.024= NormalizeDouble(0.036,2) =0.04
这里不需要规范化(四舍五入)。

但我怎样才能将其归一化而不是四舍五入呢?

 
Roman Starinskij:

对不起,但你如何获得你想要的价值?

为此,只值得制定什么是 "正确的价值观"。))

如果我使用推荐的功能,那么。

- 在一个案例中,我得到了一个适当的四舍五入的值
0.06-0.02= NormalizeDouble(0.039999999999999,2) =0.04
除法是近似的,你不能不进行归一化。

- 在第二种情况下,我也得到了四舍五入,但在这种情况下不需要。
0.06-0.024= NormalizeDouble(0.036,2) =0.04
这里不需要归一化(四舍五入)。

但我如何正确地进行归一化,而不是四舍五入?

上面的例子表明,你在使用一些直观的算法来确定规范化的 "正确性"。在第一种情况下,它是一个无限的分数,而在第二种情况下,它是一个有限的分数。调整你的算法,将实数转换为所需的形式。

虽然最简单的方法是--提前决定所需的计算精度。

[删除]  
Ihor Herasko:

要做到这一点,只需要制定什么是 "正确的价值观 "就可以了))

从上面的例子中,你可以看到,你正在使用一些直观的算法,通过这些算法来确定规范化的 "必要性"。在第一种情况下,它是一个无限的分数,而在第二种情况下,它是一个有限的分数。调整你的算法,将实数转换为所需的形式。

虽然最简单的方法是提前决定你需要的精度。


我只需要得到同样的数字,而我以前是在计算器中得到的。:-)这些是你需要的价值。
因此,用 "0.06-0.02 "可以得到 "0.04",用 "0.06-0.024 "可以得到 "0.036"。
 
Roman Starinskij:

我只需要得到我习惯于在计算器中得到的相同数字。:-)这些是你需要的价值。
如果你想要 "0.06-0.02",你会得到 "0.04",如果你想要 "0.06-0.024",你会得到 "0.036"。
如果你想得到0.036(小数点后3位),你需要归一化到小数点后3位,而不是2位。
[删除]  
Dmitry Fedoseev:
如果你想要0.036(小数点后3位),请将其规范化为3,而不是2。

我错了,3位以内的数字应该是正常化的。有可能做到这一点吗?

 
Roman Starinskij:

我错了,3位以内的数字应该是正常化的。这样做行得通吗?

这是你的代码。

0.06-0.024 = NormalizeDouble(0.036,2) = 0.04

与其说是2,不如说是3,那就是0.036。