DoubleとFLOATの比較 - MathFloorの不明確なエラー - ページ 7

 
Maxim Kuznetsov:
目的によっては、完全に整数値にする価値がある場合もあります。神経を使わずに済みますね :-)あるとき、多段階を正確にマークアップしなければならないタスクがあり、最初はダブルで苦労しましたが、すべてを0からの整数点に変換したら、すべてが簡単でシンプルでミスのないものになりました。
まさにその通りです。整数に変換してみました。
 
Vladimir:

タスクで必要な場合を除き、丸めを使用する必要はありません。


それは、「タスクが違う」ということです :-)

 

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)));
 

1.05に正規化 すると、1.1に正規化されてしまうので、原理的にMathFloorでは必要ないのです :-)

私はMathFloorを全く 使わないため。

しかし、問題は別にある。

 

Но задача то другая.  

なぜ違うのですか? あなたは切り捨てが必要だと言いましたが、MathFloorは まさにその通りです。

 
Taras Slobodyanik:

なぜ違うのですか? あなたは切り捨てが必要だと言いましたが、それはMathFloorが行うことです。

しかし、正規化すると、計算が丸くなり、MathFloorが 意味をなさなくなります。

 

上記の例で1156.12とすると、この数値は1156.1199999999891としてメモリに保存されます。

つまり、100分の1に切り捨てようとすると、1156.12ではなく1156.11になってしまうというのが、あなたが頭を悩ませた「特殊性」なのです。

 
Taras Slobodyanik:

上記の例で1156.12とすると、この数値は1156.1199999999891としてメモリに保存されます。

つまり、100分の1に切り捨てようとすると、1156.12ではなく1156.11となる--これが今回の問題の「特殊性」である。

はい :-)ありがとうございます。