簡體   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