代码之家  ›  专栏  ›  技术社区  ›  Chris Dennett

Java double不会否定!为什么?

  •  1
  • Chris Dennett  · 技术社区  · 14 年前

    出于某种原因,我很难否定一个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;
     }
    

    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);
     } 
    }
    
    1 回复  |  直到 13 年前
        1
  •  6
  •   casablanca    14 年前
    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 ,两个否定的结果会被抵消,留下一个肯定的答案。