关于c#:避免浮点精度问题

Avoid floating point precision issues

我即将创建一个移动游戏的地形,允许一个巨大的地形,主要受可用的硬盘空间限制。

这需要将浮点数限制为2个数字的"后点精度"。
在点之后保持2个数字的精度有什么好方法?

请记住:我正在移动设备上运行,因此该方法应该快速且易于使用,并且应该适用于游戏所需的任何算术。

更多信息

我不是在谈论空间(我知道浮动需要多少空间,真的),我在谈论的问题是,当我的浮点数小数点后需要很多数字时,我会松开精度。

使用int会导致我每帧都将int转换为浮点数。我不知道转换的速度有多快,但在为很多对象执行此操作时,这似乎会花费很多性能。 (记得我在移动设备上)。

当然我也不是在谈论地形,我在谈论地形中的物体!地形是一个专门的系统,它实际上可以保持地形大小,从而大大扩展了浮动的极限(当你有足够的磁盘空间时甚至可以在这个系统中保存北美,但实际上限制设置为-99km到+ 99km)。

编辑2

像往常一样,在游戏中,运动是基于时间的,意味着我需要将对象的速度乘以一个给定的修饰符,这会破坏我的数字,这些数字仅限于小数点后的2个数字。


一种有趣的方法是将其实现到运动功能中:

1
2
3
4
5
6
7
float result = //multiply force by time
float modulus = result%0.01f;
result -= modulus; //you will do this in any case
if(modulus>=0.005f) {/*round up. if you want it to only round down, remove
  the next 2 lines, if you want it to only round up, remove
  the conditional statement*/

  result+=0.01f; }

我无法考虑如何进一步优化它,我删除了else语句并让它无条件地消除模数,因为无论如何它都会被完成。


嗯,无论你选择什么样的精度,他们仍然占用相同的空间。 单身或双人会有所不同,但你应该问的真正问题是你是否需要浮点数。 如果你可以在int中拟合数字,那就这样做。