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

 
Алексей Тарабанов:
恶魔就在其中......当然,是2.6。
是时候睡觉了。
 
lilita bogachkova:
是时候睡觉了。
加入
 
Dmitry Fedoseev:
什么是5?对这样的数字进行归一化处理会使所有的9变成0,所以归一化后再抛弃会得到错误的结果。
DoubleToString(0.99999,5)
 
Vasyl Nosal:
DoubleToString(0.99999,5)

那么,如果数字是0.99999,而你必须留下两个数字呢?丢弃其余的。我们需要得到0.99。所以我们把它归一到三位数,得到1.000,丢弃一位,得到1.00,但没有得到0.99。

 
Dmitry Fedoseev:

那么,如果数字是0.99999,而你必须留下两个数字呢?丢弃其余的。我们需要得到0.99。所以我们把它归一到三位数,得到1.000,丢弃一位,得到1.00,但没有得到0.99。

extern ushort Characters_delete = 3;

///////////////////////////////////////////
string data=DoubleToString(0.99999,5); 
string resoult=StringSubstr(data,0,StringLen(data)-Characters_delete);
 
Vasyl Nosal:
是的......突然间我们有了0.999999这个数字,而不是0.999999。
 
Dmitry Fedoseev:
是的......突然间我们有了0.999999这个数字,而不是0.999999。
string(0.999999)
 
这让我想起了关于失踪的程序员的轶事。而他正坐在一个冷水浴中,手中拿着洗发水,上面写着 "肥皂、冲洗、重复"。
 
Dmitry Fedoseev:
这让我想起了一个关于程序员失踪的笑话。他坐在一个冷水澡里,手里拿着洗发水,上面写着 "肥皂,冲洗,重复"。
为什么一种语言需要如此精确:数字(例如)"0.7 "实际上被存储为 "0.69999..."?
这实际上是在什么地方使用的吗?我习惯于像在计算器中计算数字,它显示得很准确。
是的,也许是计算器本身四舍五入了,而且本身并没有存储准确的数字...
谁需要使用这种带有无限分数的近似数字而不是精确的数值?
除以它,得到的是0.7,而且不必费心裁剪或四舍五入 :-)
 
Dmitry Fedoseev:

那么,如果数字是0.99999,而你必须留下两个数字呢?丢弃其余的。我们需要得到0.99。所以我们把它归一到三位数,得到1.000,丢弃一位,得到1.00,但没有得到0.99。

试着得到一个0.999999999999999 的结果

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*x-x = 10*0.99999999999-0.99999999999-0.99999999999

9*X = 9*0.99999999999999999

我们得到9*X=9或X等于1(一)。

void OnStart()
  {
      double v1=1.0/3.0;
      double v2=3.0*v1;

      Print("v1 = (1/3) = ",DoubleToString(v1)," | ","v2 = 3*(1/3) = ",DoubleToString(v2));
  }

v1 = (1/3) = 0.33333333 | v2 = 3*(1/3) = 1.00000000

或0.999999999999999=1.0

void OnStart()
  {
      double v1=0.99999999999999999;

      if(v1>=1.0)
         Print("v1 (",DoubleToString(v1),") >= 1.0");
  }

v1 (1.00000000) >= 1.0