如何在Frog Jump赋值中修复不正确的float舍入到整数?

时间:2015-10-11 12:46:57

标签: java

为什么性能测试在my solution上失败:

class Solution {
    public int solution(int X, int Y, int D) {
        return (int) Math.ceil((Y-X)/(float)D);
    }
}

如何改进?

试验:

public class SolutionTest {
    private Solution solution;

    @Test
    public void defaultTest(){
        assertEquals(3, solution.solution(10,85,30));
    }
    @Test
    public void many_jump1Test(){
        assertEquals(499999998, solution.solution(-499999996,500000000,2));
    }
    @Before
    public void init(){
        solution = new Solution();
    }
}

2 个答案:

答案 0 :(得分:1)

我认为你的解决方案遇到了舍入错误,因为float缺乏精确性。您的测试结果表明:

  

对于输入(3,999111321,7),解决方案返回了错误的答案(得到142730192预期为142730189)。

考虑到这些输入,如果我们使用(X - Y) / D,并且使用float,请让我们查看double的结果:

float f = (999111321 - 3) / 7.0f;  // 1.42730192E8
double d = (999111321 - 3) / 7.0;  // 1.427301882857143E8
                                              ^^

请注意小数点前最后两位数的舍入误差。为了避免这种情况并获得正确的答案,您只需将D投射到double而不是解决方案中的float

答案 1 :(得分:0)

整数运算速度更快,可以使用整数除法:

(Y - X + D - 1)/ D

通常/ D会给出底价。为了获得ceil值,添加D - 1。

这可以保存

  • 浮动部门
  • 服用ceil
  • 转换为int