0

我有将 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”变量。我可以向你们保证,我将其声明为双 diff;-我不知道为什么它变成 int diff :) 解决了谢谢 :)

4

5 回答 5

4

Math.abs并且在将 s 作为参数传递时Math.min都返回s ,因此您的代码正在执行整数除法而不是您期望的双除法。如果将and替换为and ,您的代码应该可以按预期工作。intint3103.010.0

于 2011-09-11T17:05:58.803 回答
2

这是因为它正在执行整数除法。与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)
于 2011-09-11T17:07:08.707 回答
1

在使用整数除法时期望双精度必须是本书中最古老的问题。;)

您的回合不会做任何事情,因为您的整数除法会产生整数结果。

于 2011-09-11T17:06:18.980 回答
0

预期结果是 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

我怀疑您不想进行整数除法。因此,您必须将3and替换103.0and 10.0

于 2011-09-11T17:07:56.063 回答
0

您必须记住要考虑这样一个事实,即当一个整数在 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
于 2011-09-11T17:18:18.277 回答