2011-09-02 3 views
2

double 값을 저장하려는 NSArray가 있습니다.doubleValue는 개체를 항상 double 값으로 올바르게 변환하지 않습니다.

NSNumber *num; 
num = [NSNumber numberWithDouble:someDouble]; 
[setOfDoubles addObject:num]; 

에 따라

num = [setOfDoubles lastObject]; 
[setOfDoubles removeLastObject]; 
doubleValueToUse = [num doubleValue]; 

를 따를 때 나는 내 문제가 가끔 (안 항상), 예를 들어있는 요소를 읽으면서 나는 요소를 추가

NSMutableArray *setOfDoubles; 

를 따를 때 나는 그것을 정의 num (객체로서)이 5.1 일 때 doubleValueToUse (double 값)는 5.099999999999996입니다. 내가 num (객체로서)을 5.1이라고 생각하는 방식은 내가 디버깅하는 것입니다. 그리고 라인 num = [setOfDoubles lastObject]에 마우스를 올려 놓을 때입니다; 그것은 5.1을 보여 주지만 doubleValue 변환 후에는 내가 언급 한 숫자가됩니다. 아무도 왜 이런 일이 일어나는 지 알고 있습니까?

답변

4

모든 숫자가 부동 변수를 사용하여 정확하게 표현 될 수있는 것은 아닙니다. 예를 들어, 일반적인 10 진수 (10 진수) 시스템에서는 유한 한 자릿수를 사용하여 1/3을 정확하게 표현할 수 없지만 3 진수 (3 진수)에서는 0.1에 불과합니다. 마찬가지로 10 진수의 유한 한 자릿수로 작성할 수있는 숫자는 반드시 2 진 표현에 유한 한 자릿수를 가질 필요가 없으므로 오류가 발생합니다. 주제에

몇 가지 링크는 당신이 관심이 있다면 :

http://floating-point-gui.de/basic/

http://www.mathworks.com/support/tech-notes/1100/1108.html

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

+0

감사합니다! 이제 문제가 무엇인지 이해합니다. 그렇다면 실제 계산기 나 계산기로 아이폰 계산기를 어떻게 해석하면이 문제를 해결할 수 있을까요? 그들은 float 대신에 다른 데이터 타입을 사용합니까? 아니면 어떤 종류의 반올림을 구현합니까? – Dogahe

+0

반올림은 확실히 사용됩니다 (예 : 2/3 시도). 가능하면 다른 기술 (가능한 경우 고정 소수점 계산 사용). – SVD

+0

고마워요! 보내 주신 링크가 많은 도움이되었습니다. float (또는 double)의 정밀도로 조작 한 다음 % g.14와 같은 문자열을 포맷하여 소수점 이하 자릿수로 결과를 표시하면 문제가 해결된다는 것을 알았습니다. 나는 이것에 예외가 생길지 모르지만, 지금까지는 효과가있다. 다시 한 번 감사드립니다! – Dogahe

1

이는 일반적인 값인 float입니다.

float 숫자의 초기 (동일한) 표현을 코드의 모든 위치에 저장하려면 예를 들어 NSString에 저장할 수 있습니다. 유동 번호가 필요하면 [NSString floatValue];으로 작성하십시오. 그러나 많은 양의 float 값이있는 경우에는 효과가 없습니다.

관련 문제