如何使用两位小数将浮点数保存到nsnumber

时间:2014-03-20 16:58:01

标签: ios objective-c

我正在尝试将浮点数保存到nsnumber但我只想用两位小数保存它。我知道我可以通过使用此代码

首先转换为NSString来实现
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
但是看起来很笨拙。我想做的就是转换

float numb = 23.25454 into NSNumber 23.25

6 个答案:

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

如果您正在寻找面向对象的方法,请尝试使用NSDecimalNumber,它是NSNumber的子类。使用您的浮点值初始化NSDecimalNumber,然后调用decimalNumberByRoundingAccordingToBehavior:。这为您提供了一些选项,说明如何使用NSDecimalNumberBehaviors进行截断或舍入,您可以在其中设置比例(小数点后的位数)和NSRoundingMode。查看the docs了解详情。

答案 2 :(得分:1)

使用此

float numb = 23.25454;

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

答案 3 :(得分:1)

不可能使用floatdouble或其中任何一个包裹为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(我只是在飞行中这样做,原谅任何错误!)=你明白了!

为了解决这个问题,有the NSDecimalNumber class,它是NSNumber的子类,代表基数为10的数字。该类提供了执行base-10算术的基本操作。您无法在base-10和base-2数字之间轻松混合算术,甚至无法直接从NSDecimalNumberfloat创建double - 您将后者格式化为{{ 1}}(即将它们转换为基数为10的表示) - 并使用NSString方法提取double值描述为:

  

接收器的近似值为doubleValue

请注意近似

这么长的答案来回答一个问题:你真的想存储一个doublefloat值到完全两个小数地方?

您可以使用doubleround& floor家庭大致做到这一点,但要为“错误”的结果做好准备。例如。尝试:

ceil

HTH

答案 4 :(得分:0)

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

答案 5 :(得分:0)

NSDecimalNumber与NSDecimalNumberHandler是获得准确精度的最佳方法,如果您想要作为对象。以下是示例代码。

Write-Host "##vso[build.updatebuildnumber]"$buildVersion

NSRoundingMode提供了更多Rounding选项。