This question already has answers here:
Double.Epsilon for equality, greater than, less than, less than or equal to, greater than or equal to
                                
                                    (10个答案)
                                
                        
                                6年前关闭。
            
                    
我正在做一个项目,以模拟太空中的物理/重力,其中一部分是预测轨道并显示某些信息,其中之一是围ap和细胞凋亡(轨道的最接近和最遥远的一点)。实现此目的的最简单方法是找到相对于静止物体的轨道上物体的接近速度为0的点,但是由于每秒的计算量受到限制,因此几乎永远不会发生该值精确为0的情况-因此我当时的想法是比较每个循环,如果当前值的符号和循环之前的值发生了变化。

该代码类似于以下内容:

ArrayList orbit = new ArrayList();
orbit.Add(newValue);

//In case the sign changes - to +

if(
   orbit.Count >= 2 &&
   physics.getVelocity(orbit[orbit.Count-1], otherObject) == Math.Abs(physics.getVelocity(orbit[orbit.Count-1], otherObject) &&
   physics.getVelocity(orbit[orbit.Count-2], otherObject) != Math.Abs(physics.getVelocity(orbit[orbit.Count-2], otherObject)
)

//In case the sign changes + to -

if(
   orbit.Count >= 2 &&
   physics.getVelocity(orbit[orbit.Count-1], otherObject) != Math.Abs(physics.getVelocity(orbit[orbit.Count-1], otherObject) &&
   physics.getVelocity(orbit[orbit.Count-2], otherObject) == Math.Abs(physics.getVelocity(orbit[orbit.Count-2], otherObject)
)


但是有时它似乎不起作用,所以我调试了变量,却找不到任何错误,总有这样的模式:

Value (1): -0.4523452
Value (2): 1.2435235


要么

Value (1): 0.4523452
Value (2): -1.2435235


但是该算法忽略了一些事件,但是只有当数字接近于0(如上)时,我才观察到,但是看起来像这样:

Value (1): 64.904534
Value (2): -7.3456800


很好,我不知道为什么。我希望有人能帮助我-如果还有任何疑问,请询问:)

最佳答案

这种检测类型,要检测一个值何时为负值而另一个为正值(与顺序无关),则应使用Math.Sign方法:

if (Math.Sign(a) != Math.Sign(b)) { ... }


但是,@ supercat的答案对于您当前的代码是正确的,那样的话浮点值就很挑剔。

关于c# - Math.Abs​​()不会创建确切的绝对值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17114906/

10-12 00:26