Java 简单方程无法通过单元测试

Java 简单方程无法通过单元测试,java,double,rounding-error,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.76到18四舍五入应该没有任何问题 编辑: 真正

我有一个方法,它将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.76到18四舍五入应该没有任何问题

编辑:


真正的函数稍有不同,我没有Math.absa-b,但是我定义了diff变量作为结果。我可以向你们保证,我宣布它是双差;-我不知道为什么它会变成int diff:SOLVED谢谢:

Math.abs和Math.min在将int作为参数传递时都返回int,因此您的代码正在执行整数除法,而不是预期的双除法。如果你用3.0和10.0替换3和10,你的代码应该像你期望的那样工作。

使用整数除法时需要一个双精度必须是这本书中最古老的问题


整数除法产生整数结果时,您的轮没有任何作用。

这是因为它正在执行整数除法。a=1459,b=1500时:

简单的解决方法是使用浮点作为参数之一,强制它执行浮点除法:

Math.round((Math.abs(a-b)/3.0) - (Math.min(a,b)-1500)/10.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.0和10.0替换3和10。

您必须记住,在Java中,当一个整数除以另一个整数时,结果是一个整数,而不是一个浮点,任何余数都会被删除。例如,6/4==1,而不是1.5

方法14591500

|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
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