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

相關文章
相關標籤/搜索