2013-05-03 2 views
1

내가 좋아하는 두 개의 수레를 추가하고 원인 :추가 플로트는 오답

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

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

내가 무엇입니까 대답은 55555905.00

계산기 55555908.00 동안이다 내가 뭘 잘못하고있는거야?

+5

나에게 소수점 정밀도 문제를 떠 같은데 –

+0

당신은'사용할 수 있습니다 floatValue 대신 doubleValue를 사용하여 더 많은 정밀도를 추가 할 수 있지만, 약 14 자리를 초과하면 부동 소수점 부정확도가 표시됩니다. – Kevin

+0

http://www.binaryconvert.com/result_float.html?decimal=053053053053053053053048 –

답변

5

주석에서 이미 언급했듯이, 이것은 부동 소수점 정밀도 문제입니다. float의 정밀도는 약 7 자리 10 진수 double입니다.

재단 프레임 워크는 또한 38 진수의 정밀도로, 밑이 10 인 산술을 수행하기위한 NSDecimalNumber 클래스를 제공합니다

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 인코딩.

이 인코딩 유형은 부호, 유효 숫자 및 지수를 사용합니다.

이 인코딩으로 인해 값을 변경하지 않는다고 보장 할 수 없습니다.

또한 유효 숫자의 수가 10 진수가 아닌 2 진수이기 때문에 약간 바뀔 수 있습니다.

단 정밀도 (실수)는 23 비트의 지수와 8 비트의 지수 및 1 부호 비트를 제공합니다.

이중 정밀도 (double)는 52 비트의 지수와 11 비트의 지수 및 1 부호 비트를 제공합니다.