OC NSNumber的奇怪之处—精度问题(CGFloat转化成NSNumber或NSString)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

目前我的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位,按四舍五入法保留,其余位数的可能不精确。




转载于:https://my.oschina.net/u/2560887/blog/599102

你可能感兴趣的:(OC NSNumber的奇怪之处—精度问题(CGFloat转化成NSNumber或NSString))