[英]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 ......}之一
謝謝。
你可以取你的數字n
的d=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.