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

 

数学6年生。教科書Nikolsky S.M., Potapov M.K. Moscow: 2012.- 256 с

丸め込み。

丸め

 

何とも白熱した話題になってしまった。MT4は四捨五入で正しく動作するようです。
NormalizeDouble(0.055,2) は、「0.055」という数字を「0.06」に丸める のではなく、「0.05」に切り詰めるという意味でした。

このMKLの機能を理解するのに苦労しています。BORROWNの数値を正しい位置に持っていくだけならともかく、「1.0015223567」をNormalizeDouble関数で丸める意味がよくわかりません。
つまり、NormalizeDouble(1.001526789, 5)とすると、「1.00152」となるのです。
四捨五入して"1.00153" とする必要はない。そのためのRoundDouble関数があるはずです =)

可能なのでしょうか?それとも、いつも四捨五入して、間違った数字を出す必要があるのでしょうか?

 

もう決心したほうがいいよ。四捨五入しているのです。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

NormalizeDoubleによるMT4での数値の丸め方

ローマン・スタリンスキー 2016.01.21 10:03

こんにちは。何が問題なのか、教えてください。

関数NormalizeDouble(0.055,2) は、なぜ数値"0.055" を "0.06" に丸める のですか?

分数の丸め機能ではありません。


それはない。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

NormalizeDoubleによるMT4での数値の丸め方

ローマン・スタリンスキー 2016.01.25 14:30

何とも白熱した話題になってしまった。MT4は四捨五入で正しく動作するようです。
NormalizeDouble(0.055,2) は、数値「0.055」を「0.06」に丸める のではなく、「0.05」に切り詰めるという意味です。

このMKLの機能を理解するのに苦労しています。DIRECTの数値を正しい位置に持っていくだけならともかく、「1.0015223567」をNormalizeDouble関数で丸める意味がよくわかりません。
つまり、NormalizeDouble(1.001526789, 5)とすると、「1.00152」となるのです。
四捨五入して"1.00153" とする必要はない。そのためのRoundDouble関数があるはずです =)

可能なのでしょうか?それとも、ずっと丸くして、いらない数字を出す必要があるのでしょうか?


そして、実験のために。

//+------------------------------------------------------------------+
//|                                              NormalizeDouble.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
#property description "Проверка NormalizeDouble"
input double   value=0.055;      // нормализуемое число 
input int      digits=2;         // кол-во знаков после запятой 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print("Число ",value," округлённое с точностью до ",digits," знаков = ",NormalizeDouble(value,digits));
  }
//+------------------------------------------------------------------+
ファイル:
Test.mq5  2 kb
 
Roman Starinskij:

何とも白熱した話題になってしまった。MT4は四捨五入で正しく動作するようです。
NormalizeDouble(0.055,2) は、「0.055」という数値を「0.06」に丸める のではなく、「0.05」に切り詰めるという意味でした。

このMKLの機能を理解するのに苦労しています。BORROWNの数値を正しい位置に持っていくだけならともかく、「1.0015223567」をNormalizeDouble関数で丸める意味がよくわかりません。
つまり、NormalizeDouble(1.001526789, 5)とすると、「1.00152」となるのです。
四捨五入して"1.00153" とする必要はない。そのためのRoundDouble関数があるはずです =)

可能なのでしょうか?それとも、いつも丸くして、いらない数字を出す必要があるのでしょうか?

トリミングが必要ならトリミングを、ラウンドが必要ならラウンドを。NormalkizeDouble()関数が丸くなり、これが最も頻繁に必要とされるものです。

NormalizeDouble()の代わりにRoundDouble()を使用すべきと考える理由は何でしょうか?この世界はあなたがつくったのですか?ボールが転がり、正方形の角が4つあるのはいいのか?

 
Roman Starinskij:

何とも白熱した話題になってしまった。


全てはトピックスターターが言語ドキュメントを読まず、言われたことを聞かないからです
 
Slawa:
これは、著者が言語ドキュメントを読まず、言われたことを聞いていないからです。

分数の割り算や四捨五入の以下の動作が少し不明です。

2つの方程式があります。
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

推奨されているNormalizeDouble関数を 使用すると、このような結果になります。
0.03999999999999999 = 0.04
0.036 = 0.04

最初の例では、本当に0.04という 値を得る必要がありますが、2番目の例では0.03が 必要です(これは通常の電卓がそうであるように)。
完全ではない分数が返されるので、NormalizeDoubleを使うべきですが、2番目の例では、この関数は正しくない値を返すので、最初の例にも使わないわけにはいきません。

 
Roman Starinskij:

分数の割り算や丸めについて、以下の動作が少し不明です。

2つの方程式があります。
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

推奨されているNormalizeDouble関数を 使用すると、このような結果になります。
0.03999999999999999 = 0.04
0.036 = 0.04

最初の例では、本当に0.04という 値を得る必要がありますが、2番目の例では0.03が 必要です(これは通常の電卓がそうであるように)。
完全ではない分数が返されるので、NormalizeDoubleを使うべきですが、2番目の例では、この関数は正しくない値を返すので、最初の例にも使わないわけにはいきません。

通常の電卓では正しく計算されない、はずだ。

 
Slawa:
全ては、トピックスターターが言語ドキュメントを読まず、言われたことを聞かなかったからです

N+1 digit < 5 ならば、N 番目の桁を保持し、N+1 以降の桁は全てゼロにする。

N+1 digit≥ 5 の場合、N番目の桁を1つインクリメント し、N+1 、それ以降の桁は全て0にします。

申し訳ありませんが、なぜ「2」で丸めるとすぐに=0.06000000にならないのか、まだ理解していません。

void OnStart()
  {

   double v1 = NormalizeDouble(0.055,3);
   double v2 = NormalizeDouble(0.0549,3);

   v1=NormalizeDouble(v1,2);
   v2=NormalizeDouble(v2,2);
   Print("v1 = ",DoubleToString(v1),", v2 = ",DoubleToString(v2));

  }

v1 = 0.06000000, v2 = 0.06000000

void OnStart()
  {

   double v1 = NormalizeDouble(0.055,2);
   double v2 = NormalizeDouble(0.0549,2);

   Print("v1 = ",DoubleToString(v1),", v2 = ",DoubleToString(v2));

  }

v1 = 0.06000000, v2 = 0.05000000

void OnStart()
  {
   for(int i=7;i>=1;i--)
     {
      double v1 = 1.1234567;
      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 = 1 = 1.1000000, v2 = 1 = 1.1000000
v1 = 2 = 1.1200000, v2 = 2 = 1.1200000
v1 = 3 = 1.1230000, v2 = 3 = 1.1240000
v1 = 4 = 1.1235000、v2 = 4 = 1.1235000
v1 = 5 = 1.1234600, v2 = 5 = 1.1234600
v1 = 6 = 1.1234570, v2 = 6 = 1.1234570
v1 = 7 = 1.1234567, v2 = 7 = 1.1234567 です。




 
lilita bogachkova:


申し訳ないが、「2」で四捨五入すると、なぜ「= 0.06000000」にならないのかがまだ理解できない


なぜなら、0.6だから、0.5は不正でしか得られないから。
 
lilita bogachkova:

申し訳ないが、「2」で四捨五入すると、なぜ「= 0.06000000」にならないのか、まだ理解できていない


1桁だけ正規化する場合は、0、1、2、3、4→0、5、6、7、8、9→1という単純なもので、1桁だけ正規化する場合は、0、1、2、3、4→0、5、6、7、8、9→1という単純なものです。

2桁を正規化する場合、0〜49→0、50〜99→1というように2桁の数字が考慮される。結局のところ、1.49という数字を整数に丸めなければならない場合、1に対する利用可能な100分の49の距離に対して、100分の51である2を本当に得なければならないのだろうか。

3桁、4桁などでも同じです。

理由: