我有一个方法,它将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 :)已经解决了谢谢:))
答案 0 :(得分:4)
Math.abs
作为参数传递时, Math.min
和int
都返回int
,因此您的代码正在执行整数除法而不是您期望的双除法。如果您将3
和10
替换为3.0
和10.0
,那么您的代码应该可以正常运行。
答案 1 :(得分: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
简单的解决方法是强制它执行浮点除法,而不是使用float作为参数之一:
Math.round((Math.abs(a-b)/3.0) - (Math.min(a,b)-1500)/10.0)
答案 2 :(得分:1)
使用整数除法时期望加倍必须是书中最古老的陷阱。 ;)
你的回合没有做任何事情,因为整数除法产生整数结果。
答案 3 :(得分: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
我怀疑你不想进行整数除法。因此,您必须将3
和10
替换为3.0
和10.0
。
答案 4 :(得分: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