2012-07-10 84 views
8

我想知道是否有一個簡單的函數可以使用這樣的示例。 我有一個舍入一個浮點數在objective-c

float value = 1.12345; 

我想呼籲像

float value2 = [roundFloat value:value decimal:3]; 
NSLog(@"value2 = %f", value2); 

圓它,我得到「1.123」 是否有任何Library或默認函數,該函數或我應該寫一個代碼塊對於這種類型的計算?

感謝您的幫助提前

回答

7

使用NSLog(@"%f", theFloat)總輸出的六個小數,例如:

float theFloat = 1; 
NSLog(@"%f",theFloat); 

輸出:

1.000000 

換句話說,你將永遠不會使用NSLog(@"%f", theFloat)得到1.123。後三位小數

截止:

float theFloat = 1.23456; 
float newFLoat = (int)(theFloat * 1000.0)/1000.0; 
NSLog(@"%f",newFLoat); 

輸出:

1.234000 

回合到三位小數(使用roundf()/lroundf()/ceil()/floor()):

float theFloat = 1.23456; 
float newFLoat = (int)(roundf(theFloat * 1000.0))/1000.0; 
NSLog(@"%f",newFLoat); 

輸出:

1.235000 

回合三位小數(骯髒的方式):

float theFloat = 1.23456; 
NSString *theString = [NSString stringWithFormat:@"%.3f", theFloat]; 
float newFloat = [theString floatValue]; 
NSLog(@"%@",theString); 
NSLog(@"%f",newFloat); 

輸出:

1.235 
1.235000 
+0

'%F'不輸出6個小數,它_rounds_至6個小數。實際的浮點值不是很漂亮。 – Sulthan 2012-07-10 10:23:56

+0

這隻適用於具有精確表示形式的特定值作爲二進制分數。它在90%以上的案例中不起作用。 – EJP 2012-07-11 00:15:19

-1

嘗試

#import <math.h> 

float cutFloat(float number, int decimal) { 
    number = number*(pow(10,decimal)); 
    number = (int)number; 
    number = number/(pow(10,decimal)) ; 

    return number; 
} 
+0

這個解決方案將不是倒號。它會將其切成特定的小數位。 – nfarshchi 2012-07-10 10:31:15

+0

在大多數情況下,它甚至不會那麼做。 – EJP 2012-07-11 00:13:05

3

有關打印值使用:

NSLog(@"value2 = %.3f", value2);

四捨五入至3個十進制數字計算之前,並沒有真正意義,因爲float不是一個確切的數字。即使你把它加到1.123,它也會是1.122999999998

規則:

  1. 通常只需要四捨五入到打印結果 - 字符串格式化可以處理這個問題(見上)。
  2. 對於精確計算(例如貨幣),請勿使用浮點數,請使用NSDecimalNumber或定點算術。
+0

感謝您的幫助,但在此示例中,我應該使用'float'也是任何額外的小數會在我的具體計算一些錯誤。不過謝謝你的幫助也 – nfarshchi 2012-07-10 10:28:18

+0

我想NSDecimalNumber,那就是也很大。感謝您的建議。 +1 – nfarshchi 2012-07-10 11:31:36

+1

@nfarshchi這種說法是自相矛盾的說法。 *要麼*你必須使用float *或*你必須有一個特定的小數位數。你*不能同時擁有:這是數學上的不可能。 – EJP 2012-07-11 00:14:04

0

需要注意的是 「圓」 不一定是一個簡單的話題,因爲你的想法。例如

DIY Calculator: Rounding Algorithms 101列出了舍入的數16種不同的方法。

Wikipedia:Rounding涵蓋了很多相同的地面

而且CPLUSPLUS有一堆Rounding Algorithms,很容易翻譯到Objective-C的

你想怎麼輪將取決於上下文的源代碼是什麼你正在處理數據。

我要指出,堆棧溢出已經有一個plethora of other questions about rounding in objective-c

1

浮點數沒有小數位,他們有二進制位置。小數基數有小數位。除非您轉換爲小數基數,否則無法將浮點數整數轉換爲特定的小數位數。沒有套路,方法,功能等,即回報浮點值都不可能完成這項任務。

0
//Your Number to Round (can be predefined or whatever you need it to be) 
float numberToRound = 1.12345; 

float min = ([ [[NSString alloc]initWithFormat:@"%.0f",numberToRound] floatValue]); 
float max = min + 1; 
float maxdif = max - numberToRound; 
if (maxdif > .5) { 
    numberToRound = min; 
}else{ 
    numberToRound = max; 
} 

//numberToRound will now equal it's closest whole number (in this case, it's 1) 
0

這裏有一個簡單的方法來做到這一點:

float numberToRound = 1.12345f; 
float remainder = numberToRound*1000.0f - (float)((int)(numberToRound*1000.0f)); 

if (remainder >= 0.5f) { 
    numberToRound = (float)((int)(numberToRound*1000.0f) + 1)/1000.0f; 
} 
else { 
    numberToRound = (float)((int)(numberToRound*1000.0f))/1000.0f; 
} 

對於任意小數位,取代1000.0f在上面的代碼與

float mult = powf(10.0f, decimal);