2019独角兽企业重金招聘Python工程师标准>>>
目前我的XCode版本是7.2的。下面是我的测试代码:
CGFloat width = [UIScreen mainScreen].bounds.size.width;
CGFloat height = [UIScreen mainScreen].bounds.size.height;
NSLog(@"width :%f,height: %f", width, height);
NSNumber *numberWidth = [NSNumber numberWithFloat:width];
NSNumber *numberHeight = [NSNumber numberWithFloat:height];
NSLog(@"numberHeight :%@, numberWidth :%@", numberHeight, numberWidth);
NSString *stringHeight = [NSString stringWithFormat:@"%f", height];
NSString *stringWidth = [NSString stringWithFormat:@"%f", width];
NSLog(@"stringHeight :%@, stringWidth :%@", stringHeight, stringWidth);
CGFloat fromNumberWidth = [numberWidth floatValue];
NSLog(@"fromNumberWidth : %f", fromNumberWidth);
CGFloat floatTest = 120.234567;
NSNumber *numberFloatTest = [NSNumber numberWithFloat:floatTest];
CGFloat fromNumberfloatTest = [numberFloatTest floatValue];
NSLog(@"numberFloatTest is %f", [numberFloatTest floatValue]);
NSLog(@"floatTest:%f, numberFloatTest:%@, fromNumberfloatTest:%f", floatTest, numberFloatTest, fromNumberfloatTest);
//输出: floatTest:120.234567, numberFloatTest:120.2346, fromNumberfloatTest:120.234566
#warning 怎么搞得呢?
NSNumber *a = [NSNumber numberWithFloat:256.379157];
NSLog(@"a : %@", a);
NSLog(@"float is %f",[a floatValue]);
NSLog(@"float is %.4f",[a floatValue]);
NSLog(@"float is %.5f",[a floatValue]);
width :320.000000,height: 568.000000
numberHeight :568, numberWidth :320
stringHeight :568.000000, stringWidth :320.000000
fromNumberWidth : 320.000000
numberFloatTest is 120.234566
floatTest:120.234567, numberFloatTest:120.2346, fromNumberfloatTest:120.234566
a : 256.3792
float is 256.379150
float is 256.3792
float is 256.37915
从输出结果可以看出,
CGFloat转化成NSString,CGFloat形式的输出是什么样的,NSString对象输出的也是什么样的,把NSString对象转化回CGFloat对象也还是原来的CGFloat对象。CGFloat转化成NSString精度不会改变的。数值完全不会变。
而CGFloat转化成NSNumber,如果是小数点后为0的,到了NSNumber对象时就不显示小数点后的了,但再把NSNumber对象转化成CGFloat,就又转化成有小数点的了,可以说基本没有影响。
问题是,如果小数点后不为0,像上面的
CGFloat floatTest = 120.234567
这个转化为NSNumber后输出就不正常了,
floatTest:120.234567, numberFloatTest:120.2346, fromNumberfloatTest:120.234566
这一行输出结果可以很明显的看出变化了,不明白为什么小数点后保留了4位,并且用的四舍五入,再由NSNumber转化为CGFloat则不是原来的值了。
对比最后4行代码和最后4行输出,当转化为NSNumber输出时,小数点后仍然保留的是4位,并且用的四舍五入,再由NSNumber转化为CGFloat时,也已经不是原来的值了,如果以4位精度输出的话,与NSNumber的结果是一致的,而如果是5位精度的话,显然不正确,如果是6为全部输出,结果还是不正确的。不知道到底怎么回事,望知道的大神帮解答一下。
总之,我看出来的就是NSNumber就保留小数点后4位,按四舍五入法保留,其余位数的可能不精确。