DoubleとFLOATの比較 - MathFloorの不明確なエラー - ページ 7 1234567 新しいコメント Vladislav Andruschenko 2017.02.27 09:03 #61 Maxim Kuznetsov: 目的によっては、完全に整数値にする価値がある場合もあります。神経を使わずに済みますね :-)あるとき、多段階を正確にマークアップしなければならないタスクがあり、最初はダブルで苦労しましたが、すべてを0からの整数点に変換したら、すべてが簡単でシンプルでミスのないものになりました。 まさにその通りです。整数に変換してみました。 Vladislav Andruschenko 2017.02.27 09:30 #62 Vladimir:タスクで必要な場合を除き、丸めを使用する必要はありません。 それは、「タスクが違う」ということです :-) Taras Slobodyanik 2017.02.27 10:59 #63 MathFloor またはMathCeilを 使用して丸めを行う場合、元の結果を正しい精度に正規化する必要があります。なぜなら、計算中に整数ではなく、小数が出ることがあり、この数字の「尻尾」が不正に丸められる ため、結果が不正になるからです。 例えば、こんな感じです。double point=0.01;Print (DoubleToStr(1156.12/point, 15));Print (NormalizeDouble(1156.12/point, _Digits));では、MathFloor を使って丸めをしてみましょう。double point=0.01;Print (DoubleToStr(MathFloor(1156.12/point), 15));Print (MathFloor(NormalizeDouble(1156.12/point, _Digits))); Vladislav Andruschenko 2017.02.27 11:02 #64 1.05に正規化 すると、1.1に正規化されてしまうので、原理的にMathFloorでは必要ないのです :-)私はMathFloorを全く 使わないため。 しかし、問題は別にある。 Taras Slobodyanik 2017.02.27 11:07 #65 Но задача то другая. なぜ違うのですか? あなたは切り捨てが必要だと言いましたが、MathFloorは まさにその通りです。 Vladislav Andruschenko 2017.02.27 11:09 #66 Taras Slobodyanik:なぜ違うのですか? あなたは切り捨てが必要だと言いましたが、それはMathFloorが行うことです。しかし、正規化すると、計算が丸くなり、MathFloorが 意味をなさなくなります。 Taras Slobodyanik 2017.02.27 11:22 #67 上記の例で1156.12とすると、この数値は1156.1199999999891としてメモリに保存されます。つまり、100分の1に切り捨てようとすると、1156.12ではなく1156.11になってしまうというのが、あなたが頭を悩ませた「特殊性」なのです。 Vladislav Andruschenko 2017.02.27 11:23 #68 Taras Slobodyanik:上記の例で1156.12とすると、この数値は1156.1199999999891としてメモリに保存されます。つまり、100分の1に切り捨てようとすると、1156.12ではなく1156.11となる--これが今回の問題の「特殊性」である。はい :-)ありがとうございます。 1234567 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
目的によっては、完全に整数値にする価値がある場合もあります。神経を使わずに済みますね :-)あるとき、多段階を正確にマークアップしなければならないタスクがあり、最初はダブルで苦労しましたが、すべてを0からの整数点に変換したら、すべてが簡単でシンプルでミスのないものになりました。
タスクで必要な場合を除き、丸めを使用する必要はありません。
それは、「タスクが違う」ということです :-)
MathFloor またはMathCeilを 使用して丸めを行う場合、元の結果を正しい精度に正規化する必要があります。
なぜなら、計算中に整数ではなく、小数が出ることがあり、この数字の「尻尾」が不正に丸められる ため、結果が不正になるからです。
例えば、こんな感じです。
Print (DoubleToStr(1156.12/point, 15));
Print (NormalizeDouble(1156.12/point, _Digits));
では、MathFloor を使って丸めをしてみましょう。
Print (DoubleToStr(MathFloor(1156.12/point), 15));
Print (MathFloor(NormalizeDouble(1156.12/point, _Digits)));
1.05に正規化 すると、1.1に正規化されてしまうので、原理的にMathFloorでは必要ないのです :-)
私はMathFloorを全く 使わないため。
しかし、問題は別にある。
Но задача то другая.
なぜ違うのですか? あなたは切り捨てが必要だと言いましたが、MathFloorは まさにその通りです。
なぜ違うのですか? あなたは切り捨てが必要だと言いましたが、それはMathFloorが行うことです。
しかし、正規化すると、計算が丸くなり、MathFloorが 意味をなさなくなります。
上記の例で1156.12とすると、この数値は1156.1199999999891としてメモリに保存されます。
つまり、100分の1に切り捨てようとすると、1156.12ではなく1156.11になってしまうというのが、あなたが頭を悩ませた「特殊性」なのです。
上記の例で1156.12とすると、この数値は1156.1199999999891としてメモリに保存されます。
つまり、100分の1に切り捨てようとすると、1156.12ではなく1156.11となる--これが今回の問題の「特殊性」である。
はい :-)ありがとうございます。