在objective-c中舍入浮点数

时间:2012-07-10 09:55:57

标签: objective-c floating-point rounding

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

float value = 1.12345;

我想通过调用类似

的方式来解决这个问题
float value2 = [roundFloat value:value decimal:3];
NSLog(@"value2 = %f", value2);

我得到“1.123” 是否有Library或默认函数,或者我应该为这种类型的计算编写代码块?

提前感谢您的帮助

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

打印值使用:

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

在计算之前舍入到3个十进制数字实际上没有意义,因为float不是精确数字。即使您将其四舍五入为1.123,也会类似于1.122999999998

规则:

  1. 通常你只是向上舍入以打印结果 - 字符串格式化程序可以处理它(见上文)。
  2. 要进行精确计算(例如货币),请不要使用浮点数,使用NSDecimalNumber或定点算术。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

请注意,“Round”并不一定像您想象的那么简单。例如

DIY Calculator: Rounding Algorithms 101列出了16种不同的方法来舍入数字。

Wikipedia:Rounding涵盖了很多相同的基础

Cplusplus拥有一堆Rounding Algorithms的源代码,可以轻松转换为objective-c

您想要舍入的方式取决于您使用数据的上下文。

我应该指出Stack Overflow已经有plethora of other questions about rounding in objective-c

答案 4 :(得分: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)

答案 5 :(得分: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);

答案 6 :(得分:-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;
}