在Objective-C中舍入到(1,2或5)x 10 ^ n?

Den*_*er9 13 c iphone math objective-c ios

是否有一种简单的方法可以将值舍入到最接近的值(1,2或5)x 10 ^ n,其中n是整数?如{...,.05 .1,.2,.5,1,2,5,10,20,50,100 ......}之一

谢谢.

Mar*_*som 14

您可以使用d=floor(log10(n))您的数字n来获得比例,然后除以10以d将数字标准化为范围[1.0,10.0).从那时起它应该很容易圆,因为可能性非常有限.完成后,将其乘以10以d将数字恢复到原始范围.

以下函数在C中,我对Objective-C知之甚少,不知道这是不是惯用的.

double RoundTo125(double value)
{
   double magnitude;
   magnitude = floor(log10(value));
   value /= pow(10.0, magnitude);
   if (value < 1.5)
      value = 1.0;
   else if (value < 3.5)
      value = 2.0;
   else if (value < 7.5)
      value = 5.0;
   else
      value = 10.0;
   value *= pow(10.0, magnitude);
   return value;
}
Run Code Online (Sandbox Code Playgroud)


Blu*_*eft 7

x向下舍入到最接近的值c * 10^n,请使用

f(c) = c * 10^(floor(log(x/c)))
Run Code Online (Sandbox Code Playgroud)

(假设x是积极的).所以要向下舍入到最近的任何一个,只需找到

max(f(1), f(2), f(5))
Run Code Online (Sandbox Code Playgroud)

要舍x入到最接近的值c * 10^n,请使用

g(c) = c * 10^(ceiling(log(x/c)))
Run Code Online (Sandbox Code Playgroud)

(再次假设x是积极的).所以要找到最接近的那些,只需找到

min(g(1), g(2), g(5))
Run Code Online (Sandbox Code Playgroud)

现在简单地舍入到最接近的任何值,找到最近的向下舍入(第一段)和最近的向上舍入(第二段),并选择更接近的值x.

  • 另请注意,上面示例中的`log`实际上是`log10`. (3认同)