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

时间:2011-06-15 21:58:24

标签: iphone objective-c c ios math

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

感谢。

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:7)

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

f(c) = c * 10^(floor(log(x/c)))

(假设x为正)。所以要向下舍入到最近的任何一个,只需找到

max(f(1), f(2), f(5))

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

g(c) = c * 10^(ceiling(log(x/c)))

(再次假设x为正)。所以要找到最接近的那些,只需找到

min(g(1), g(2), g(5))

现在简单地舍入到这些值中最接近的值,找到最近的向下舍入(第一段)和最近的向上舍入(第二段),并选择更靠近x的那个。

答案 2 :(得分:0)

我看到你使用浮点数来处理。我想指出,在标准C库中有两个功能可以帮助您:

double floor(double); //round down
double ceil(double);  //round up

他们返回舍入的数字。还有另一个舍入函数。你可以找到他们的参考here。在了解它们的工作原理后,您可以编写自己的舍入函数。哪个会使用规范化。看一下例子:

// this function will round to tens
float my_floor(float d)
{
    return floor(d/10)*10;
}

答案 3 :(得分:0)

对数方法可行,但我会尝试字符串转换。我不知道Objective C,虽然Google暗示你需要一些名为stringWithFormat的东西。在Java中,代码将是

String s = String.format("%f", theNumber);
StringBuffer buf = new StringBuffer(s);
int len = buf.length()-1;
char c = buf.getCharAt(len);
switch (c)
{
case '9': case '8': case '7': case '6':
buf.setCharAt(len) = '5'; break;
case '4' : case '3':
buf.setCharAt(len) = '2' break;
default: break; /* don't change '0', '1', '2', '5' */
}
double roundNumber = Double.parseDouble(buf.toString());

可能会更快。 (可能会慢一些!)您也可以尝试在字符串中搜索小数点,并在新增最后一个小数位的大小后从原始数字中减去增量。