繁体   English   中英

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

[英]Round to (1, 2, or 5) x 10^n in Objective-C?

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

谢谢。

你可以取你的数字nd=floor(log10(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;
}

要将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那个。

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

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

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

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

对数方法可行,但我会尝试字符串转换。 我不知道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());

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM