Rounding numbers in Objective-C

I’m trying to do some number rounding and conversion to a string to enhance the output in an Objective-C program.

I have a float value that I’d like to round to the nearest .5 and then use it to set the text on a label.

  • Breaking retain cycle with strong/weak self
  • NSTableview View Based Scrolling Performance
  • How to SHA hash in cocoa/iOS
  • @synthesize vs @dynamic, what are the differences?
  • Will Xcode 7.3.1 work on macOS 10.12?
  • What is a better way to create a game loop on the iPhone other than using NSTimer?
  • For example:

    1.4 would be a string of: 1.5

    1.2 would be a string of: 1

    0.2 would be a string of: 0

    I’ve spent a while looking on Google for an answer but, being a noob with Objective-C, I’m not sure what to search for! So, I’d really appreciate a pointer in the right direction!

    Thanks,
    Ash

    11 Solutions Collect From Internet About “Rounding numbers in Objective-C”

    Thanks for the pointers everyone, I’ve managed to come up with a solution:

    float roundedValue = round(2.0f * number) / 2.0f;
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setMaximumFractionDigits:1];
    [formatter setRoundingMode: NSNumberFormatterRoundDown];
    
    NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:roundedValue]];
    [formatter release];
    

    The above works for the test cases I threw at it, but if anyone knows a better way to do this I’d be interested to hear it!

    float floatVal = 1.23456;
    

    Rounding

    int roundedVal = lroundf(floatVal); 
    
    NSLog(@"%d",roundedVal);
    

    Rounding Up

    int roundedUpVal = ceil(floatVal); 
    
    NSLog(@"%d",roundedUpVal);
    

    Rounding Down

    int roundedDownVal = floor(floatVal);
    
    NSLog(@"%d",roundedDownVal);
    
    NSString *numberString = [NSString stringWithFormat:@"%f", round(2.0f * number) / 2.0f];
    

    Use lroundf() to round a float to integer and then convert the integer to a string.

    NSString *numberString = [NSString stringWithFormat:@"%d",lroundf(number)];
    

    I’d recommend looking into using NSNumberFormatter.

    NSString *intNumberString = [NSString stringWithFormat:@"%d", (int)floatNumber];
    

    Following Technique worked for me in a financial application.

     NSString *dd=[NSString stringWithFormat:@"%0.2f",monthlyPaymentCalculated];
    
            monthlyPaymentCalculated=[dd doubleValue];
    
    self.monthlyPaymentCritical=monthlyPaymentCalculated;
    

    what is did is first is rounded it with %0.2f and stored it in NSString then i simply converted it again into double and result was good for my calculation.

    a simple way:

    float theFloat = 1.23456;
    int rounded = roundf(theFloat); NSLog(@"%d",rounded);
    int roundedUp = ceil(theFloat); NSLog(@"%d",roundedUp);
    int roundedDown = floor(theFloat); NSLog(@"%d",roundedDown);
    // Note: int can be replaced by float
    

    I needed to be able to round to a specific digit (not necessarily to whole integers). I made a NSNumber category (based off Ash’s answer) and added the following method to it:

    - (NSString *)stringByRounding:(NSNumberFormatterRoundingMode)roundingMode
          toPositionRightOfDecimal:(NSUInteger)position
    {
        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        [formatter setMaximumFractionDigits:position];
        [formatter setRoundingMode:roundingMode];
        NSString *numberString = [formatter stringFromNumber:self];
        return numberString;
    }
    

    Which allows me to use it like so:

    [aNumber stringByRounding:NSNumberFormatterRoundUp toPositionRightOfDecimal:2];
    

    I can use it to round to integers by passing in 0 as the second parameter:

    [aNumber stringByRounding:NSNumberFormatterRoundPlain toPositionRightOfDecimal:0];
    

    With these functions you can round to any value.. If you use p=2, you get even numbers.

    float RoundTo(float x, float p)
    {
      float y = 1/p;
      return int((x+(1/(y+y)))*y)/y;
    }
    
    float RoundUp(float x, float p)
    {
      float y = 1/p;
      return int((x+(1/y))*y)/y;
    }
    
    float RoundDown(float x, float p)
    {
      float y = 1/p;
      return int(x*y)/y;
    }