プログラムが意図したとおりに動作しない理由をテストする際に、失敗していると思われる計算を即時ウィンドウに入力してみました。
Math.Floor(1.0f)
1.0 - correct
でも:
200f * 0.005f
1.0
Math.Floor(200f * 0.005f)
0.0 - incorrect
さらに:
(float)(200f * 0.005f)
1.0
Math.Floor((float)(200f * 0.005f))
0.0 - incorrect
おそらく、いくつかのフロート損失が発生しています。たとえば、0.99963 ≠ 1.00127 です。
より安価な値を保存してもかまいませんが、非損失の方法で、たとえば、整数と同じように値を保存する数値型があった場合、パフォーマンスを向上させることができれば、小数点以下 3 桁までです。
このようなエラーに関しては、おそらく (n * 0.005f) を計算するより良い方法があると思います。
編集:
TY、ソリューション:
Math.Floor(200m * 0.005m)
また、私が理解しているように、1/200 を 1/256 に変更してもかまわない場合、これは機能します。
Math.Floor(200f * 0.00390625f)
私が使用しているソリューション。これは私のプログラムで取得できる最も近いものであり、問題なく動作するようです:
float x = ...;
UInt16 n = 200;
decimal d = 1m / n;
... = Math.Floor((decimal)x * d)