繁体   English   中英

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

[英]how to save a float to nsnumber with just two decimals

我试图将浮点数保存到nsnumber但我只想用两位小数保存它。 我知道我可以通过首先使用此代码转换为NSString来实现

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];

但看起来很笨拙。 我想做的就是转换

float numb = 23.25454 into NSNumber 23.25

只需使用上述任何功能进行循环即可

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;

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

用这个

float numb = 23.25454;

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

使用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(我只是在飞行中这样做,原谅任何错误!)=你明白了!

为了解决这个问题,有NSDecimalNumber ,它是NSNumber的子类,表示基数为10的数字。 该类提供了执行base-10算术的基本操作。 你不能在base-10和base-2数字之间轻松混合算术,你甚至不能直接从floatdouble创建NSDecimalNumber - 你将后者格式化为NSString (即将它们转换为基数为10的表示) - 和使用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

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

如果您想要作为对象,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提供了更多Rounding选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM