Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给定乘数的下一个倍数_Java_Algorithm_Function_Math_Double - Fatal编程技术网

Java 给定乘数的下一个倍数

Java 给定乘数的下一个倍数,java,algorithm,function,math,double,Java,Algorithm,Function,Math,Double,我想写一个函数,在给定乘数的情况下,求出一个数的下一个倍数。源数字和乘法器都可以是浮点 预期: nextMult(3.654,0.5) = 4.0 nextMult(3.165,0.15) = 3.30 nextMult(3.452,0.002) = 3.452 nextMult(2, 0.3) = 2.1 nextMult(2, 0.2) = 2 nextMult(4, 3) = 6 我当前的解决方案: public double nextMult(double source, double

我想写一个函数,在给定乘数的情况下,求出一个数的下一个倍数。源数字和乘法器都可以是浮点

预期:

nextMult(3.654,0.5) = 4.0
nextMult(3.165,0.15) = 3.30
nextMult(3.452,0.002) = 3.452
nextMult(2, 0.3) = 2.1
nextMult(2, 0.2) = 2
nextMult(4, 3) = 6
我当前的解决方案:

public double nextMult(double source, double multiplier)
{
    for (double i = (double)((long)source - multiplier); i <= source + multiplier; 
        i += multiplier) 
    {
        if (i >= source) 
            return i;
    }
}
public double nextMult(双源,双倍增)
{
对于(double i=(double)((长)源-乘数);i=源)
返回i;
}
}

我不喜欢多重铸件。是否有更有效的方法或现有的库解决方案可以做到这一点?

是的。既然您已经提供了一个有效的解决方案,您会注意到您已经提供了一个O(n)解决方案,该解决方案经历了一系列操作,并且在找到它之前似乎一直在递增。当您执行
nextMult(100000000000,1)时,这会变得非常可怕我们会在这里一整天手工迭代循环

然而,实际上存在一个O(1)解

int multiple = (int) (source / multiplier); //we get the whole number portion of the divided value, i.e. 4/3 = 1, 3.654/0.5 = 7
double remainder = source % multiplier; //we need to check for if it matches the higher
if(remainder > 0) {
    multiple++; // and we want the next higher one
}
return multiplier * multiple;
也就是说,这只处理正值。我将把处理负值作为练习留给您


编辑:您将需要为模数实现BigDouble。double和module显然彼此讨厌。

源和乘法器都属于double类型

double result = Math.ceil(source/multiplier) * multiplier;

这适用于所有测试用例…

nextMult(100000000000,1);将仅通过我的解决方案迭代一次。此外,此解决方案不适用于我的测试用例nextMult(4,3)=6@Rohit我刚刚测试了我的盒子和4,3的作品。使用双精度模数时出现问题,但使用
BigDecimal
而不是
double
应该可以解决问题。已尝试编辑的答案。。。由于某种原因,下一个结果(3.452,0.002)给出了3.454。。。谢谢。是的,这很有效。只需将第二个
源代码更改为乘数。