我想知道是否有一个简单的函数可以使用这样的示例。我有一个
float value = 1.12345;
我想通过调用类似的东西来四舍五入
float value2 = [roundFloat value:value decimal:3];
NSLog(@"value2 = %f", value2);
我得到“1.123”是否有任何Library
或默认功能,或者我应该为这种类型的计算编写一个代码块?
提前感谢您的帮助
我想知道是否有一个简单的函数可以使用这样的示例。我有一个
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
换句话说,你永远不会1.123
通过使用NSLog(@"%f", theFloat)
.
小数点后三位截止:
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 计算器:舍入算法 101列出了 16 种不同的舍入方法。
维基百科:四舍五入涵盖了很多相同的领域
Cplusplus 有一堆舍入算法的源代码,这些算法很容易翻译成 Objective-c
你想如何四舍五入取决于你对数据所做的事情的上下文。
我应该指出,Stack Overflow 已经有很多其他关于在 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);
尝试
#import <math.h>
float cutFloat( float number, int decimal) {
number = number*( pow(10,decimal) );
number = (int)number;
number = number/( pow(10,decimal) ) ;
return number;
}