2011-07-26 2 views
0

Im 정보를 변환하는 중 Im 문자열을 float으로 수신하여 모두 합계를 구합니다. 내가 예를 들어, 플로트를 변환 할 때목표 c : 부동 소수점을 피하기 위해 문자열을 구문 분석합니다.

문제는 :

myString = @"13502.63" 
float *f = [myString floatValue]; 
NSLog(@"Converted %f", f); 

"F"의 결과는 13502.629883

이 일이 어떤 값에 대한 확인입니다,하지만 난을 추가해야하는 경우 이 값이 너무 많으면이 여분의 소수 값으로 인해 결과가 잘못됩니다.

누구든지 나를 도와 줄 수 있습니까?

감사합니다.

+0

여분의 소수로 인해 결과가 잘못되었음을 의미합니까? – sergio

+0

수레가 ** 정확하게 나타낼 수없는 값이 있습니다. 그 값을 float에 저장하려고하면 실제로 * 가장 가까운 값을 * 얻을 수 있습니다. 플로트에서 일련의 작업을 수행하면 정확도를 잃을 수 있습니다. 대신에 NSDecimalNumber를 사용하십시오. – albertamg

답변

1

불행하게도 어떤 언어의 모든 부동 소수점 형식이 문제가됩니다.

NSDecimalNumber를 사용 해본 적이 있습니까?

이 값은 float보다 느릴 수 있지만 문제가되지 않는다면 훨씬 더 정확하게 계산됩니다.

어떤 이유로 속도가 필요한 경우, 두 배 또는 긴 배가 충분히 정확합니까?

+0

이중으로 변경하여 완벽하게 작동합니다. 감사합니다. –

+0

두 배로 정확도는 향상되지만 동일한 앨리어싱 효과가 발생할 수 있지만 작은 소수점 자리에서 일어날 수 있습니다. – iandotkelly

2

정확성을 원할 경우 플로트를 사용하지 않아야합니다. NSDecimalNumber을 사용하십시오. 그들이 기본 진 정수 형식으로 변환 할 필요로

NSString *myString = @"13502.63"; 
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:myString]; 
1

float 숫자에는 정확한 표현이 없으므로 "13502.63"이 13502.629883으로 변환되는 이유입니다. 이것은 원래 숫자에 가장 가까운 float입니다.

그래서 저는 플로트가있는 쉬운 해결책이 없다고 생각합니다. NSDecimalNumber을 시도해야합니다. 성능에 대해서는 잘 모르지만 정확한 표현을 제공해야합니다.

+0

가장 가까운 float의 의미를 설명해 주시겠습니까? 수레는 신중한 가치가 있습니까? 내 말은, 13502.630000은 가능한 부유물이 아닌가? –

관련 문제