如何获得5或10的下一个最高倍数

根据一些规则,我希望根据一些规则获得次高的数字,因为我在描述它们时遇到一些困难,我将通过例子来说明:

 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。

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

或类似的东西:-)

这是一个适用于样本数据的函数:

 def f(x): lx = log10(x) e = floor(lx) if (lx - e) < log10(5): return 5 * 10 ** e else: return 10 ** (e+1) 

伪代码应该是这样的:

 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 

对于数字> 1,它检查如下:if <5,5。if <10,10,if <50,50。对于数字<1,它检查如下:if> 0.5 1. if> 0.1,0.5。 等等

如果你打算使用双精度并且需要精确的结果,那么使用双精度乘法/除法/ log10的所有方法都不起作用(或者至少很难实现并certificate是正确的)。 多精度算术可能对此有所帮助。 或者像这样使用搜索:

 powers = [1.e-309, 1.e-308, ..., 1.e309] p = search_first_greater(powers, number) if (number < p / 2.) return p / 2. return p 

search_first_greater可以实现为:

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