2013-02-15 21 views
1

我正在寻找一个程序,发现2个斜坡,他们比较他们看看他们是否相等。我正在使用双打。我发现尽管我的斜坡应该是“平等的”,但他们会出现一点点偏离,所以并不显示为平等。例如,我得到1.0000000000000009和0.9999999999999999的一个斜率。所以他们理论上应该是平等的,但他们不是。当他们应该是Java的斜率不相等

我能做些什么来解决这个问题?

+5

第1步:我们展示的代码。 – 2013-02-15 20:00:55

+1

我认为这可能是一个精确的问题。很多时候,当你使用浮动和双打时,一点精确度就会丢失。我认为这将帮助你解决你的问题:http://stackoverflow.com/questions/2389457/java-loss-of-precision – 2013-02-15 20:01:02

+3

这是一个浮点常见问题解答。 [每位计算机科学家应该了解的浮点算法](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – 2013-02-15 20:01:29

回答

2

如果您使用双打,您将永远不会解决这个问题:小数表示方式存在局限性,会在您的计算中积累,并给您这些微小差异。一个好的代码审计实际上会警告你双打之间的平等。

处理它的一种方法是确保差值的绝对值低于您设置的某个限制。

Here's an article关于浮点数表示和比较的危害。

或者,您可以切换到更精确的数字处理类,如BigDecimal

+1

在两种情况下BigDecimal比double要好:如果小数部分是特殊的,或者如果有合适的有限精度大于double提供的有限精度。计算斜率可能涉及诸如1/3的分数,这些分数不能在BigDecimal中精确表示,而与规模无关,从而导致舍入误差。 – 2013-02-15 20:14:39

0

比较2个山坡上,你可以设置一些PRECISION_LEVEL然后比较如下

final double PRECISON_LEVEL = 0.01; 
if(Math.abs(slope1 - slope2) < PRECISION_LEVEL) { 
    System.out.println("Equal"); 
} 
else { 
    System.out.println("Not Equal"); 
} 
相关问题