Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

erdinc27

macrumors regular
Original poster
Jul 20, 2011
168
1
i have a float value
e.g : 3.92199993
i want to truncate it like 3.921 what i did is to convert it to NSString with format 0.3f and have it what i want in string type. But when i convert that string to a float then it becomes like 3.92156863
So what i can have 3.921 from the first float ?
 

AxoNeuron

macrumors 65816
Apr 22, 2012
1,251
855
The Left Coast
That solution sounds really slow. I'd suggest multiplying it by some number to get it to be > 1000, convert it to an Int (to lose the rest of the decimal precision), convert it back to a Float, and then divide it by that number.

However if you insist on using NSString, you can do this to specify the precision:

Objective-C
Code:
NSString *numberRep = [NSString stringWithFormat:@"%.4f", number];

Swift
Code:
let numberRep = NSString(format: "%.4f", numberRep);

Floating point math is complicated. The code above will let you guarantee a specific level of precision, but when you perform operations on the resulting numbers you will encounter floating point error to some degree. It's the same reason you will sometimes see 1.9999998998 instead of 2.00000000 for example.

If you want to make explicitly certain that you will never have any floating point error problems, then don't use floating point variables. Multiply them by some set value, convert them to an Int, then deal with them as Int's. That way you can avoid floating point error. When you are ready to display them to the user, just divide by the set value and convert back to Floats.
 
Last edited:

chown33

Moderator
Staff member
Aug 9, 2009
9,891
6,872
Beyond the pale
i have a float value
e.g : 3.92199993
i want to truncate it like 3.921 what i did is to convert it to NSString with format 0.3f and have it what i want in string type. But when i convert that string to a float then it becomes like 3.92156863
So what i can have 3.921 from the first float ?
3.92199993 is much closer to 3.922 than it is to 3.921. So printing 3.921 is arguably worse (less accurate).

Example code and output:
Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, const char * argv[])
{
    float f1 = 3.922f;
    printf( " f1: %.10f, %.3f\n", f1, f1 );

    float f2 = 0;
    sscanf( "3.921", " %f ", &f2 );
    printf( " f2: %.10f, %.3f\n", f2, f2 );

    return 0;
}

## Output
 f1: 3.9219999313, 3.922
 f2: 3.9210000038, 3.921
Note the conversion of the string "3.921" did not result in 3.92156863. That would be an error of about 1 part in 10,000, which is much worse than one should be getting from float conversion.

Post your code, or there's no way to guess why the result was 3.92156863.
 

erdinc27

macrumors regular
Original poster
Jul 20, 2011
168
1
thank you for your help guys. I made it by using NSNumberFormatter.
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.