在测试我的程序为什么没有按预期工作时,我尝试在即时窗口中输入似乎失败的计算。
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。
我不介意存储价格较低的值,但是以无损的方式存储,例如,如果有一种数字类型将值存储为整数,但如果可以提高性能,则只能存储三位小数。
我认为对于此类错误,可能有更好的方法来计算 (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)