Простое уравнение не проходит модульный тест - PullRequest
0 голосов
/ 11 сентября 2011

У меня есть метод, который принимает 2 целых числа в качестве аргументов и возвращает:

 public int method(int a, int b){
   return Math.round((Math.abs(a-b)/3) - (Math.min(a,b)-1500)/10)
 }

Я создал модульный тест, который принимает значения 1400 и 1500 (ожидаемое значение 43), однако он не выполняется для 1459 и1500. Ожидаемый результат - 18, однако мой метод возвращает 17. Я полагаю, что это может быть как-то связано с округлением, однако я не вижу никакой очевидной ошибки.Не должно быть никаких проблем с округлением 17,7 (6) до 18.

РЕДАКТИРОВАТЬ:

реальная функция была немного другой (у меня не было Math.abs (ab), но вместо этого я имелопределил переменную "diff" в результате этого. Я мог бы пообещать вам, ребята, что я объявил ее как двойную разницу; - Я понятия не имею, почему она стала int diff :). РЕШЕНО спасибо:)

Ответы [ 5 ]

4 голосов
/ 11 сентября 2011

Math.abs и Math.min оба возвращают int с при передаче int с в качестве аргументов, поэтому ваш код выполняет целочисленное деление вместо ожидаемого двойного деления. Если вы замените 3 и 10 на 3.0 и 10.0, ваш код должен работать так, как вы ожидаете.

2 голосов
/ 11 сентября 2011

Это потому, что он выполняет целочисленное деление.С a = 1459, b = 1500:

Math.round((Math.abs(a-b)/3) - (Math.min(a,b)-1500)/10)
Math.round(Math.abs(41)/3 - (1459-1500)/10)
Math.round(41/3 - (-41)/10)
Math.round(13 - (-4))
Math.round(17)       // note that round will always get an integer as input
17

Простое решение состоит в том, чтобы заставить его выполнять деление с плавающей запятой вместо этого, используя в качестве одного из аргументов значение с плавающей запятой:

Math.round((Math.abs(a-b)/3.0) - (Math.min(a,b)-1500)/10.0)
1 голос
/ 11 сентября 2011

Ожидание двойного при использовании целочисленного деления должно быть самой старой ошибкой в ​​книге. ;)

Ваш раунд ничего не делает, так как ваши целочисленные деления дают целочисленный результат.

0 голосов
/ 11 сентября 2011

Вы должны помнить о том, что, когда целое число делится на другое целое число в Java, результатом является целое число, а не число с плавающей точкой (любой остаток отбрасывается).Например, 6/4 == 1, а не 1.5.

метод (1459, 1500)

Math.round((Math.abs(1459-1500)/3) - (Math.min(1459,1500)-1500)/10);
Math.round((41/3) - (1459-1500)/10);
Math.round(13 - (-41)/10); //41/3 == 13, not 13.6666
Math.round(13 - -4); //-41/10 == -4, not -4.1
Math.round(17);
17
0 голосов
/ 11 сентября 2011

Ожидаемый результат - 17.

|a-b| = 41
|a-b|/3 = 13

min(a,b) = 1459
min(a,b)-1500 = -41
(min(a,b)-1500)/10 = -4

13-(-4) = 17

Я подозреваю, что вы не хотите иметь целочисленное деление.Поэтому вы должны заменить 3 и 10 на 3.0 и 10.0.

...