如何将一个浮点数保存为只有两位小数的NSNumber?

3
我正在尝试将浮点数保存到NSNumber中,但我只想保留两位小数。我知道可以通过先将其转换为NSString来实现,使用以下代码:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];

但看起来有点笨重。我想做的只是转换。
float numb = 23.25454 into NSNumber 23.25
6个回答

2
使用这个
float numb = 23.25454;

NSNumber *num = @((int)(numb*100)/100.0);

简单易行,非常感谢。这比转换为NSString再转换为NSNumber更有效吗? - vboombatz
在这里,您只需要进行一次转换 - 通过@使用float制作NSNumber。在您的OP中,您将浮点数转换为字符串,然后将字符串转换为浮点数,最后再将浮点数转换为NSNumber。 - malex
使用原始类型比使用NSString格式化器效率更高。 - malex

1

使用以下任意函数将其四舍五入

float rounded = round(val * 100) / 100;
float rounded_down = floorf(val * 100) / 100;
float nearest = floorf(val * 100 + 0.5) / 100;
float rounded_up = ceilf(val * 100) / 100;

1
如果你正在寻找面向对象的方法,请尝试使用NSDecimalNumber,它是NSNumber的子类。使用你的浮点数值初始化NSDecimalNumber,然后调用decimalNumberByRoundingAccordingToBehavior:。这会给你几个选项来控制截断或舍入的方式,使用NSDecimalNumberBehaviors,你可以设置比例(小数点后的位数)和一个NSRoundingMode。请查看文档以获取更多信息。

1
使用float、double或NSNumber包装的这两者都是不可能的。您需要了解浮点数的工作原理。
所有这些都使用二进制数字,您希望表示一个恰好有两个小数位的数字。二进制小数由1/2、1/4、1/8、1/16等的总和组成,而十进制小数是1/10、1/100、1/1000等的总和。并非所有可以表示为一系列值之和的值都可以表示为另一系列中的和。这类似于在十进制中表示1/3的问题,它是3/10 + 3/100 + 3/1000 + ......的总和。
尝试将0.17写成例如17/100 = 1/10 + 7/100的1/2、1/4等的总和。嗯,它是1/8 + 9/200 = 1/8 + 1/32 + 11/8000(我只是随意这样做,原谅任何错误!)=您自己算吧!
为了解决这个问题,可以使用 NSDecimalNumber,它是NSNumber的子类,用于表示基于十进制的数字。该类提供了执行基于十进制的算术运算所需的基本操作。您不能轻松地在基于十进制和基于二进制的数字之间进行混合算术运算,甚至无法直接从floatdouble创建NSDecimalNumber - 您需要将后者格式化为NSString(即将其转换为基于十进制的表示形式),并使用doubleValue方法提取double值,如下所示:

接收方的近似值,作为double

请注意“近似值”。
因此,回答这个问题需要一个较长的答案:您真的想要将floatdouble值精确到两位小数存储吗?
您可以使用roundfloorceil系列函数进行近似计算,但需要准备好可能会得到“错误”的结果。例如,请尝试:
float a = 371371.28127;
float b = roundf(a * 100.0) / 100.0;
NSLog(@"a: %f | b: %f", a, b);

HTH


非常有帮助,谢谢。不过你提供的示例没有产生两位小数。在日志语句中,a和b的值看起来是相同的。 - vboombatz
@vboombatz - 这就是问题所在,使用roundf或类似的方法包括强制转换为int进行截断,然后再进行除法运算并不能保证两位小数,因为二进制和十进制表示方式存在问题。 - CRD

1

如果您想要获得精确的数字,并且希望以对象的形式呈现,那么使用 NSDecimalNumber 和 NSDecimalNumberHandler 是最好的方法。以下是示例代码。

-(NSDecimalNumber *)getRoundedNumberAfterPointDigitsCount:(int)digitsCount withDouble:(double)doubleValue{
    NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",doubleValue]];
    NSDecimalNumberHandler *decimalHandler = [[NSDecimalNumberHandler alloc] initWithRoundingMode:NSRoundPlain scale:digitsCount raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
    decimalNumber =  [decimalNumber decimalNumberByRoundingAccordingToBehavior:decimalHandler];
    return decimalNumber;
}

NSRoundingMode提供了更多的四舍五入选项。


0
float numb = 23.25454;
float myFloat = roundf(100 * numb) / 100.0;
NSNumber *number = [NSNumber numberWithFloat:myFloat];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接