Java 我怎样才能得到下一个最高的倍数5或10

Java 我怎样才能得到下一个最高的倍数5或10,java,algorithm,math,pseudocode,Java,Algorithm,Math,Pseudocode,从给定的double中,我想根据一些规则得到下一个最大的数字,因为我很难描述这些规则,我将通过示例说明: Input Desired output ------- -------------- 0.08 0.1 0.2 0.5 5 10 7 10 99 100 100 500 2345 5000 在某种意义上,输出应该是“5

从给定的
double
中,我想根据一些规则得到下一个最大的数字,因为我很难描述这些规则,我将通过示例说明:

Input      Desired output
-------    --------------
   0.08         0.1
   0.2          0.5
   5           10
   7           10
  99          100
 100          500
2345         5000
在某种意义上,输出应该是“5或10的下一个最高倍数”

我希望这是可以理解的;如果没有,请告诉我

实现将采用java语言,输入将为正数
double
s.

函数top5\u 10(x){
function top5_10 (x) {
  var ten = Math.pow(10, Math.ceiling(Math.ln(x)/Math.LN10)));
  if (ten > 10 * x) { ten = ten / 10; }
  else if (ten <= x) { ten = 10 * ten; }
  return x < ten / 2 ? ten / 2 : ten;
}
VarTen=数学功率(10,数学上限(数学ln(x)/数学LN10)); 如果(10>10*x){10=10/10;}
else if(ten这里有一个对样本数据有效的函数:

def f(x):
    lx = log10(x)
    e = floor(lx)
    if (lx - e) < log10(5):
        return 5 * 10 ** e
    else:
        return 10 ** (e+1)
def(x):
lx=log10(x)
e=地板(lx)
如果(lx-e)
伪代码应该是这样的:

If number > 1
    n = 1
    While(true)
        If(number < n)
            return n
        If(number < n*5)
            return n*5
        n = n*10
Else
    n = 1.0
    While(true)
        If(number > n/2)
            return n
        If(number > n/10)
            return n*2
        n = n/10.0
powers = [1.e-309, 1.e-308, ..., 1.e309]
p = search_first_greater(powers, number)
if (number < p / 2.) return p / 2.
return p
如果数字>1
n=1
While(true)
如果(数字n/2)
返回n
如果(数量>n/10)
返回n*2
n=n/10.0
对于大于1的数字,其检查方式如下:
如果<5,5.如果0.5 1.如果>0.1,0.5.等等

如果您打算使用双精度乘法/除法/log10,则所有使用双精度乘法/除法/log10的方法都不起作用(或者至少很难实现和证明正确性)。多精度算法可能有帮助。或者使用如下搜索:

If number > 1
    n = 1
    While(true)
        If(number < n)
            return n
        If(number < n*5)
            return n*5
        n = n*10
Else
    n = 1.0
    While(true)
        If(number > n/2)
            return n
        If(number > n/10)
            return n*2
        n = n/10.0
powers = [1.e-309, 1.e-308, ..., 1.e309]
p = search_first_greater(powers, number)
if (number < p / 2.) return p / 2.
return p
powers=[1.e-309,1.e-308,…,1.e309]
p=搜索优先(幂次、数)
如果(数字

搜索\u优先\u更大可实现为:

  • 线性搜索
  • 或者二进制搜索
  • 或者通过
    n=round(log10(number))
    直接计算数组索引,并仅检查
    powers[n-1..n]
  • 或者使用对数近似,比如从数字中去掉指数部分并检查幂的4个元素[]

您所有的输入数字都是正数吗?
function(1e-6)
应该评估什么?技巧问题–最接近
1e-6
的可表示双精度不是
1e-6
而是一个稍小的数字,因此
function(1e-6)
可以说应该评估为
1e-6
。如果这种可能性让你感到害怕,你应该使用
java.math.BigDecimal
或等效的方法。所有使用乘/除/对数的方法都不能+1来判断当前发布的答案是否正确(至少在理论上),-1表示浮点运算的cargo cult方法–对数函数虽然是超越函数,但不会给出完全随机的答案。@如果所有运算都由某个多精度库执行,则它们工作得非常好。否则(表示双精度运算)如果输入值接近5或10的倍数,它们可能会给出错误的结果:计算通常在最后一位或几位不精确,因此当将输入值与某个不精确的结果进行比较时(或使用地板/圆形/天花板),您可能会得到错误的结果,例如,1而不是5。@clamp最佳答案是“这些方法究竟为什么不起作用?”在执行一组适当的单元测试之后,您可能会得到您自己的结果。@Evgeny谢谢。所以我想这是因为数字错误。在我的特定情况下,输入值不能接近小数点后4位。例如,34。9999@clamp对。对于你的特殊情况,赫比和奥蒂斯的变种应该有足够的精确度,雷瓦尼的变种仍然有ve工作不正常的可能性很小。