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

目前个人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 spa

numberHeight :568, numberWidth :320 code

stringHeight :568.000000, stringWidth :320.000000 orm

fromNumberWidth : 320.000000 对象

numberFloatTest is 120.234566 string

floatTest:120.234567, numberFloatTest:120.2346, fromNumberfloatTest:120.234566 it

a : 256.3792 class

float is 256.379150 float

float is 256.3792 im

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

相关文章
相关标签/搜索