2013-05-03 23 views
1

我加入了兩個浮體,如:添加浮動會導致錯誤的答案

NSString *[email protected]"355.00"; 
NSString *[email protected]"55555550.00"; 

NSString *result=[NSString stringWithFormat:@"%.2f",[val1 floatValue]+[val2 floatValue]]; 

答案我得到的55555908.00而在計算器是 55555905.00

我我做錯了嗎?

+5

聽起來像浮點精度問題,我 – 2013-05-03 12:50:40

+0

你可以用' doubleValue'來代替'floatValue'來增加更多的精度,但是超過14位數甚至雙精度浮點數都會顯示不準確。 – Kevin 2013-05-03 12:55:09

+0

http://www.binaryconvert.com/result_float.html?decimal=053053053053053053053048 – 2013-05-03 12:55:51

回答

5

正如評論中所述,這是一個浮點精度問題。 A float的精度約爲7位十進制數字,double約有15位十進制數字。

Foundation框架還提供了NSDecimalNumber類做基地10算術,與38位十進制數字精度:

NSString *val1 = @"355.00"; 
NSString *val2 = @"55555550.00"; 
NSDecimalNumber *dec1 = [NSDecimalNumber decimalNumberWithString:val1]; 
NSDecimalNumber *dec2 = [NSDecimalNumber decimalNumberWithString:val2]; 
NSDecimalNumber *decsum = [dec1 decimalNumberByAdding:dec2]; 
NSString *result = [decsum stringValue]; 
// --> 55555905 
2

參見:用C使用float vs. double precision

浮點數IEEE 754編碼。

這種類型的編碼使用符號,有效數和指數。

由於這種編碼,你永遠不能保證你的價值沒有變化。

此外,有效數字的數量可以稍微改變,因爲它是一個二進制表示,而不是一個小數。

單精度(float)爲您提供23位有效位,8位指數和1位符號位。

雙精度(雙精度)給出52位有效位,11位指數和1位符號位。