Java double просто не отменит!Зачем? - PullRequest
1 голос
/ 08 ноября 2010

По какой-то причине у меня возникают проблемы с отрицанием двойного и последующим возвратом его при выполнении определенного условия (которое соответствует ). Он остается положительным, несмотря на любые уговоры.

 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);
 } 
}

1 Ответ

6 голосов
/ 08 ноября 2010
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, два отрицания отменяются, и вы получаете положительный ответ.

...