简单方程式单元测试失败

时间:2011-09-11 17:01:06

标签: java double rounding-error

我有一个方法,它将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 个答案:

答案 0 :(得分:4)

Math.abs作为参数传递时,

Math.minint都返回int,因此您的代码正在执行整数除法而不是您期望的双除法。如果您将310替换为3.010.0,那么您的代码应该可以正常运行。

答案 1 :(得分:2)

这是因为它正在执行整数除法。使用a = 1459b = 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

我怀疑你不想进行整数除法。因此,您必须将310替换为3.010.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