2010-11-08 65 views
1

由于某些原因,我遇到了一个否定double的问题,然后在满足某个条件时返回它(其中)。尽管有其他诱惑,但它保持乐观。Java double不会否定!为什么?

public static double angleDiffNoAbs(double from, double to, double maxValue) { 
    double diff = to - from; 
    double absdiff = Math.abs(diff); 

    if (absdiff > maxValue) { 
    double newdiff; 

    boolean clockwise = false; 

    if (from < to) { 
    newdiff = maxValue; 
    clockwise = true; 
    System.out.println("c"); 
    } else { 
    System.out.println("ac"); 
    newdiff = maxValue * -1.0d; 
    } 

    System.out.println("from: " + from + ", to: " + to + ", diff: " + diff + ", absdiff: " + absdiff + ", newdiff(limited): " + newdiff + ", wound: " + (clockwise ? "clockwise" : "anti-clockwise")); 

    return newdiff; 
    } 

    double result = ((180d + diff) % 360d) - 180d; 
    if (result < -180d) result = 360d + result; 

    return result; 
} 

在我的JUnit测试结果是:

c 
from: -10.0, to: 20.0, diff: 30.0, absdiff: 30.0, newdiff(limited): 10.0, wound: clockwise 
ac 
from: 20.0, to: -10.0, diff: -30.0, absdiff: 30.0, newdiff(limited): 10.0, wound: anti-clockwise 

我一直在看这个的年龄并不能找出问题。 JUnit测试低于(如果它帮助):

public class AngleDiffTest { 
@Test 
public void testAngleDiff() { 
    double diff = Math.abs(Player.angleDiffNoAbs(353, 12, 360f)); 
    Assert.assertFalse("diff > 200: " + diff, diff > 200); 
} 

@Test 
public void testAngleDiff2() { 
    double diff2 = Math.abs(Player.angleDiffNoAbs(360, 0, 360f)); 
    Assert.assertFalse("diff2 > 200: " + diff2, diff2 > 200); 
} 

@Test 
public void testAngleDiff3() { 
    double diff2 = Math.abs(Player.angleDiffNoAbs(-10d, 20d, 10d)); 
    Assert.assertEquals("diff2 != 10.0: " + diff2, 10d, diff2); 
} 


@Test 
public void testAngleDiff4() { 
    double diff2 = Math.abs(Player.angleDiffNoAbs(20d, -10d, -10d)); 
    Assert.assertEquals("diff2 != -10.0: " + diff2, -10d, diff2); 
} 
} 
+0

你的代码似乎在这里工作。也许尝试强制重建? – 2010-11-08 00:55:00

回答

6
from: 20.0, to: -10.0, diff: -30.0, absdiff: 30.0, newdiff(limited): 10.0, wound: anti-clockwise 

这个结果似乎是从你的第四个测试案例(testAngleDiff4),其中要传递的-10d负值为maxValue。当你做newdiff = maxValue * -1.0d时,这两个否定消除了,给你一个肯定的答案。

+0

哎呀,我是个傻瓜:)为此欢呼。我还发现我在最后一个测试用例上做了Math.abs,然后检查。 – 2010-11-08 00:55:31

+0

这就是你得到的复制面食测试用例。 – 2010-11-08 00:56:26

+4

不是傻瓜。但是您忘记了调试的基本规则:假设该错误位于您的代码中。 – 2010-11-08 00:57:38

相关问题