是否有一种简单的方法可以将值向下舍入到最近的(1,2或5)x 10 ^ n,其中n是整数?如{...,。05 .1,.2,.5,1,2,5,10,20,50,100 ......}中的一个
感谢。
答案 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());
可能会更快。 (可能会慢一些!)您也可以尝试在字符串中搜索小数点,并在新增最后一个小数位的大小后从原始数字中减去增量。