NormalizeDoubleによるMT4での数値の丸め方 - ページ 13

 
Алексей Тарабанов:
悪魔が混じっている...。もちろん、2.6です。
寝る時間だ。
 
lilita bogachkova:
もう寝る時間だ。
参加方法
 
Dmitry Fedoseev:
5って何?このような数字を正規化すると、9がすべて0になってしまうので、正規化してから捨てると間違った結果になります。
DoubleToString(0.99999,5)
 
Vasyl Nosal:
DoubleToString(0.99999,5)

では、0.99999という数字で、2桁を残さなければならない場合はどうでしょうか。残りは破棄してください。0.99を獲得する必要がある。そこで、上で提案したアルゴリズムに従って、3桁に正規化すると、1.000となり、1つ捨てると1.00となるが、0.99にはならない。

 
Dmitry Fedoseev:

では、0.99999という数字で、2桁を残さなければならない場合はどうでしょうか。残りは破棄してください。0.99を獲得する必要がある。そこで、3桁に正規化して1.000とし、1つ捨てて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という数字で、2桁を残さなければならない場合はどうでしょうか。残りは破棄してください。0.99を獲得する必要がある。そこで、上で提案したアルゴリズムに従って、3桁に正規化すると、1.000となり、1つ捨てると1.00となるが、0.99にはならない。

0.9999999999の 結果を得るようにする

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*x-x = 10*0.9999999999-0.99999999

9*X = 9*0.99999999999999999

となり、9*X = 9 または X = 1 (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.9999999999=1.0

void OnStart()
  {
      double v1=0.99999999999999999;

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

v1 (1.00000000) >= 1.0