2011-09-24 3 views
0

숫자 유형 (태그)으로 저장된 10.1234567과 같은 십진수 값의 사전이 포함 된 PList가 있습니다. 내 응용 프로그램에서
, 나는 그 PLIST를 읽고 사용자 정의 클래스와 그 접근과의 NSNumber로 그 값 (double 형의 값을) 조작 : iPhone - 소수점 7 자리 숫자 형식으로 NSDictionary에 이중 값 저장

@interface 
... 
@property(nonatomic, assign) NSNumber* someValue; 
... 
@end 

@implementation 
... 
- (NSNumber*) someValue { return [self.dict objectForKey:@"val"]; } 
- (void) setSomeValue:(NSNumber*)val { [self.dict setValue:val forKey:@"val"]; } 
... 
@end 

그럼 어떤 경우에, 나는 다시 디스크 PLIST에 쓰기.

나는 몇 시간 전에 그 값이 변환되어 이제는 10.123456699999999와 같은 것으로 나타났습니다. 그들 모두! ...

와우, 나는 그 변화를 기대하지 않았습니다.

글쎄, 나는 예를 들어, 이와 같은 여러 가지로 접근을 변경하는 문제, 포함하도록 시도했다 :

- (NSNumber*) someValue { return [self.dict objectForKey:@"val"]; } 
- (void) setSomeValue:(NSNumber*)val { [self.dict setValue: 
               [NSNumber numberWithDouble:[[NSString stringWithFormat:@"%.7lf", [val doubleValue]] doubleValue]] 
                  forKey:@"val"]; } 

을하지만 원래 7 개 소수와 그 값의 숙박을 유지 성공할 수 없다.

사전에 입력란에 Number 형식 이외의 다른 것을 사용하지 않고도 7 자리 만 쓸 수 있습니다 (문자열을 사용하면 좋은 해결책이 아닐 수 있습니다).

plist 파일을 만든 것은 수 시간의 타이핑으로 각 필드에 10 진수 값 7 개를 입력하고 그 순간에 "변환"되지 않았습니다. 그들은 10 진수로 저장되었습니다. 그래서 나는 프로그램에 의해 그들을 다시 쓸 때 그 7 개의 십진수를 유지하는 해결책이 있다고 생각합니다.

답변

1

놀라운 부동 소수점 세계에 오신 것을 환영합니다. 부동 소수점 값을 사용하려면 부동 소수점 값은 거의 원하는 값이 아닌 사실보다 머리카락이 많거나 적다는 사실을 대비해야합니다.

정수를 사용하거나 (필요한 경우 소수점 이하 자리 표시) 문자 형식으로 변환 할 수 있습니다. 정확하게 될 NSDecimalNumber 클래스가 있지만 NSNumber 체계에 맞지 않습니다. 필자가 알기에 JSON 등이 필요하다면 작동하지 않습니다. 그래도 사전 키로 작동해야한다고 생각합니다.

+0

: 당신 (올리버) 수의 진수 시스템에 쉽게 보이지만하지 바이너리!이 링크를 살펴보십시오 (숫자를 세 번째 행에 삽입 한 후 부동 소수점을 계산하고 그 값을 십진수로 변환합니다). http://www.h-schmidt.net/FloatApplet/IEEE754.html – thomas

+0

@Daniel R Hicks : 이 질문에 대한 답변은 일반적인 답변입니까? 일반적인 대답이 필요하지 않습니다. 부동 소수점 숫자, 소수/이진 개념의 속성은 무엇인지 알고 있습니다 ... 10 진수 (한 개 이상은 아님)를 사전에 그것을 읽기 전에 그 십진수 7 개가 들어있는 PLIST 파일에 넣고 xxx 쓸데없는 소수 자릿수를 추가하지 않고도 관리 할 수 ​​있습니다. – Oliver

+0

@Oliver - 부동 소수점 숫자를 사용하기로 결정했습니다. 결과는 –

0

사용 NSNumberFormatter 당신이 PLIST에서의 NSNumber를 추출하고 작업을해야 할 때 :

NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease]; 
[nf setMaximumFractionDigits:7]; 
NSNumber *yourNumber = [nf numberFromString:[[self someValue] stringValue]]; 
+0

이어야합니다. 그게 작동하지 않는다면, 너의 숫자를 012로 바꾼다. – Oliver

+0

[[someValue] stringValue]를 인쇄 해보고 무엇이 있는지 보아라. –

+0

@herz - 일단 NSNumber에 값을 저장하면 부동 소수점이된다. int 치. (또는이 경우에는 무의미한 값이 될 것입니까?) –

1

당신은 IEEE standard 754-2008로보고, 이진에 브러시 할 수 있습니다. 컴퓨터는 10 진수 0에서 9까지의 기수를 사용하여 부동 소수점을 내부적으로 저장하지 않습니다. 오히려 이진수 0과 1을 사용합니다. 10.1234567을 컴퓨터에 공급하고 64 비트 이중 부동 소수점 숫자로 저장하도록 요청하면 가장 가까운 값은 10.1234566999999와 같습니다. ... 당신이 보았습니다. 그 숫자는 실제로 1001.00111111001101011011011 (즉, 10 + 2071259/16777216)과 같습니다.

정확히 십진수 인을 저장하려면 원시 문자를 문자열로 저장하십시오. 또는 2 진수 2 진수 대신 기본 10 진수를 저장하는 다른 방법을 생각해보십시오. 당신은 정밀의 7 자리 숫자로 텍스트에 부동 소수점 숫자를 변환 할 경우

, 당신은 사용할 수 있습니다뿐만 아니라

NSString* output = [NSString stringWithFormat:@"%.7d",myFloat]; 
+0

.7f :-)를 의미합니까? 그것을 문자열로 변환하는 방법을 알고 있습니다. 하지만 ... setValue를 사용하여 해당 문자열을 NSDictionary에 제공하면 숫자 형식이 아닌 String 형식으로 저장됩니다. 형식을 변환하지 않으려는 경우, 읽은 것과 동일한 길이의 값을 저장하고 싶습니다. – Oliver

관련 문제