8

我想知道是否有一个简单的函数可以使用这样的示例。我有一个

float value = 1.12345;

我想通过调用类似的东西来四舍五入

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

我得到“1.123”是否有任何Library或默认功能,或者我应该为这种类型的计算编写一个代码块?

提前感谢您的帮助

4

7 回答 7

7

使用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
于 2012-07-10T10:18:04.097 回答
3

对于打印值使用:

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

在计算之前四舍五入到 3 位小数并没有真正意义,因为float它不是一个精确的数字。即使你把它四舍五入1.123,它也会是这样的1.122999999998

规则:

  1. 通常你只为了打印结果而四舍五入——字符串格式化程序可以处理它(见上文)。
  2. 对于精确计算(例如货币),不要使用浮点数,使用NSDecimalNumber或定点算术。
于 2012-07-10T10:16:49.137 回答
1

浮点数没有小数位,它们有二进制位。小数基数有小数位。除非您转换为十进制基数,否则您不能将浮点数四舍五入到特定的小数位数。没有返回浮点值的例程、方法、函数等可以执行此任务。

于 2012-07-11T00:12:32.897 回答
0

请注意,“圆”不一定是您想的那么简单的话题。例如

DIY 计算器:舍入算法 101列出了 16 种不同的舍入方法。

维基百科:四舍五入涵盖了很多相同的领域

Cplusplus 有一堆舍入算法的源代码,这些算法很容易翻译成 Objective-c

你想如何四舍五入取决于你对数据所做的事情的上下文。

我应该指出,Stack Overflow 已经有很多其他关于在 Objective-c 中舍入的问题

于 2012-07-10T10:34:10.780 回答
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)
于 2013-03-05T01:15:51.403 回答
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);
于 2015-05-22T20:59:22.780 回答
-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;
}
于 2012-07-10T10:05:00.927 回答