我想知道是否有一個簡單的函數可以使用這樣的示例。 我有一個舍入一個浮點數在objective-c
float value = 1.12345;
我想呼籲像
float value2 = [roundFloat value:value decimal:3];
NSLog(@"value2 = %f", value2);
圓它,我得到「1.123」 是否有任何Library
或默認函數,該函數或我應該寫一個代碼塊對於這種類型的計算?
感謝您的幫助提前
我想知道是否有一個簡單的函數可以使用這樣的示例。 我有一個舍入一個浮點數在objective-c
float value = 1.12345;
我想呼籲像
float value2 = [roundFloat value:value decimal:3];
NSLog(@"value2 = %f", value2);
圓它,我得到「1.123」 是否有任何Library
或默認函數,該函數或我應該寫一個代碼塊對於這種類型的計算?
感謝您的幫助提前
使用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
有關打印值使用:
NSLog(@"value2 = %.3f", value2);
四捨五入至3個十進制數字計算之前,並沒有真正意義,因爲float
不是一個確切的數字。即使你把它加到1.123
,它也會是1.122999999998
。
規則:
NSDecimalNumber
或定點算術。需要注意的是 「圓」 不一定是一個簡單的話題,因爲你的想法。例如
DIY Calculator: Rounding Algorithms 101列出了舍入的數16種不同的方法。
Wikipedia:Rounding涵蓋了很多相同的地面
而且CPLUSPLUS有一堆Rounding Algorithms,很容易翻譯到Objective-C的
你想怎麼輪將取決於上下文的源代碼是什麼你正在處理數據。
我要指出,堆棧溢出已經有一個plethora of other questions about rounding in objective-c
浮點數沒有小數位,他們有二進制位置。小數基數有小數位。除非您轉換爲小數基數,否則無法將浮點數整數轉換爲特定的小數位數。沒有套路,方法,功能等,即回報浮點值都不可能完成這項任務。
//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)
這裏有一個簡單的方法來做到這一點:
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);
'%F'不輸出6個小數,它_rounds_至6個小數。實際的浮點值不是很漂亮。 – Sulthan 2012-07-10 10:23:56
這隻適用於具有精確表示形式的特定值作爲二進制分數。它在90%以上的案例中不起作用。 – EJP 2012-07-11 00:15:19