在Objective-C中动态舍入数字

时间:2012-03-29 14:54:59

标签: objective-c math rounding

我知道关于SO的这类话题已有很多不同的问题,但我找不到根据我的具体需求量身定做的方法。

我所拥有的是通过网络发送给我的浮点数,我需要将其转换并绘制到屏幕上。这些数字的范围可以是5.2,285.159,294729172.258,-10734.112等。我想要做的是从最高位数下面的一位数得到用于舍入的值。

示例:

5.2 = 5
285.159 = 300
294729172.258 = 300000000
-10734.112 = -11000

非常感谢任何可以用来指导我的建议。

2 个答案:

答案 0 :(得分:3)

这是我的解决方案:

int roundMostSignificant(float input)
{
    NSNumber *number = [NSNumber numberWithFloat:input];
    static NSNumberFormatter *formatter = nil;

    if (!formatter)
    {
        formatter = [NSNumberFormatter new];
        [formatter setMinimumSignificantDigits:1];
        [formatter setMaximumSignificantDigits:1];
        [formatter setUsesSignificantDigits:YES];
    }

    return [[formatter numberFromString:[formatter stringFromNumber:number]] intValue];
}

是的,这会使用对象,但我认为从长远来看这将是您最好的选择,因为它会为您处理舍入,解析等。

答案 1 :(得分:1)

有一个NSDecimalNumberNSDecimalNumberHandler类可以做到这一点。您可以定义数字的舍入精度和方向。

简单的例子可能是:

NSDecimalNumber *dn = [NSDecimalNumber decimalNumberWithMatnissa:294729172258 exponent:-3 isNegative:NO];
NSDecimalNumberHandler *dnh = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:-6 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];

NSDecimalNumber *rounded = [dn decimalNumberByRoundingAccordingToBehavior:dnh]; 

这可能适用于你最大的数字。