我加入了兩個浮體,如:添加浮動會導致錯誤的答案
NSString *[email protected]"355.00";
NSString *[email protected]"55555550.00";
NSString *result=[NSString stringWithFormat:@"%.2f",[val1 floatValue]+[val2 floatValue]];
答案我得到的55555908.00而在計算器是 55555905.00
我我做錯了嗎?
我加入了兩個浮體,如:添加浮動會導致錯誤的答案
NSString *[email protected]"355.00";
NSString *[email protected]"55555550.00";
NSString *result=[NSString stringWithFormat:@"%.2f",[val1 floatValue]+[val2 floatValue]];
答案我得到的55555908.00而在計算器是 55555905.00
我我做錯了嗎?
正如評論中所述,這是一個浮點精度問題。 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
參見:用C使用float vs. double precision
浮點數IEEE 754編碼。
這種類型的編碼使用符號,有效數和指數。
由於這種編碼,你永遠不能保證你的價值沒有變化。
此外,有效數字的數量可以稍微改變,因爲它是一個二進制表示,而不是一個小數。
單精度(float)爲您提供23位有效位,8位指數和1位符號位。
雙精度(雙精度)給出52位有效位,11位指數和1位符號位。
聽起來像浮點精度問題,我 – 2013-05-03 12:50:40
你可以用' doubleValue'來代替'floatValue'來增加更多的精度,但是超過14位數甚至雙精度浮點數都會顯示不準確。 – Kevin 2013-05-03 12:55:09
http://www.binaryconvert.com/result_float.html?decimal=053053053053053053053048 – 2013-05-03 12:55:51