2012-10-24 2 views
1

편집 단축 중지 : 여기, 고정 내가 furture 참조 할 수 있도록 한 방법입니다NSNumberFormatter 숫자를

NSNumber *inputNumber = [[NSNumber alloc ]initWithDouble:convertValue]; 
NSNumber *resultNumber = [[NSNumber alloc]initWithDouble:result]; 


NSNumberFormatter *formatterResult = [[NSNumberFormatter alloc] init]; 
formatterResult.numberStyle = NSNumberFormatterDecimalStyle; 
NSNumberFormatter *formatterInput = [[NSNumberFormatter alloc] init]; 
formatterInput.numberStyle = NSNumberFormatterDecimalStyle; 

[formatterResult setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatterResult setMaximumFractionDigits:6]; 

[formatterInput setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatterInput setMaximumFractionDigits:6]; 
//These four lines are the one fixing the issue. 


NSString *formattedResultString = [formatterResult stringFromNumber:(NSNumber*)resultNumber]; 
NSString *formattedInputString = [formatterInput stringFromNumber:(NSNumber*)inputNumber]; 






NSString *formelString = [[NSString alloc]initWithFormat: 
          @" %@ %@ =", formattedInputString, convertFromName]; 

formelLabel.text = formelString; 


NSString *resultString = [[NSString alloc]initWithFormat: 
          @" %@ %@",formattedResultString, convertToName]; 

resultLabel.text = resultString; 

---------- 원래의 질문 ------- -----

NSNumberFormatter 단축 번호 문제가 너무 많으며 주 번호가 8 자리 이상인 경우 소수점이 표시되지 않습니다.

아래 그림 과제 :

enter image description here < - 작동하지만, 세 소수로 단축. 다음 문제를

을 (그리고 수학적으로 올바른 수행되는, 반올림) 그리고 :

enter image description here enter image description here enter image description here

하면, 아래 이미지를 바로 볼 수있는 것처럼 (가장 오른쪽의 그림은 정확) 소수를 완전히 무시합니다. 이 코드가 제대로 작동하려면 어떤 코드를 추가/변경해야합니까?

[super viewDidLoad]; 

    _convertFrom = @[@"MTPA", @"MMcf/day", 
    @"Mill.Sm3/day", @"MMBTU/day", @"Boe/day",@"ton LNG/day", @"GJ/day"]; 

    _convertTo = @[@"MTPA", @"MMcf/day", 
    @"Mill.Sm3/day", @"MMBTU/day", @"Boe/day", @"ton LNG/day", @"GJ/day"]; 

    _convertRates = @[ @1.0f, @133.3333333f, @3.775579545f, 
    @137333.3333f, @23747.68013, @1716.17252, @147247.6022]; 
//some place down in the code: 
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 

{ 

[self updateConversionLabel]; 
} 


- (void)updateConversionLabel 
{ 
float convertFrom = [[_convertRates objectAtIndex:[picker selectedRowInComponent:0]] floatValue]; 

float convertTo = [[_convertRates objectAtIndex:[picker selectedRowInComponent:1]] floatValue]; 

NSNumberFormatter *fmt = [NSNumberFormatter new]; 
float input = [fmt numberFromString:inputText.text].floatValue; 

float to = convertTo; 
float from = convertFrom; 

float convertValue = input; 
float relative = to/from; 
float result = relative * convertValue; 

NSString *convertFromName = [_convertFrom objectAtIndex:[picker selectedRowInComponent:0]]; 
NSString *convertToName = [_convertFrom objectAtIndex:[picker selectedRowInComponent:1]]; 


NSNumber *inputNumber = [[NSNumber alloc ]initWithFloat:convertValue]; 
NSNumber *resultNumber = [[NSNumber alloc]initWithFloat:result]; 


NSNumberFormatter *formatterResult = [[NSNumberFormatter alloc] init]; 
formatterResult.numberStyle = NSNumberFormatterDecimalStyle; 
NSNumberFormatter *formatterInput = [[NSNumberFormatter alloc] init]; 
formatterInput.numberStyle = NSNumberFormatterDecimalStyle; 

NSString *formattedResultString = [formatterResult stringFromNumber:(NSNumber*)resultNumber]; 
NSString *formattedInputString = [formatterInput stringFromNumber:(NSNumber*)inputNumber]; 





NSString *formelString = [[NSString alloc]initWithFormat: 
          @" %@ %@ =", formattedInputString, convertFromName]; 

formelLabel.text = formelString; 


NSString *resultString = [[NSString alloc]initWithFormat: 
          @" %@ %@",formattedResultString, convertToName]; 
          resultLabel.text = resultString; 


} 

내가 문제/수정이 코드에 가정 것 :

다음은 관련 코드입니다.

답변

2

편집 : 고정은, 여기에 내가 나중에 참조 할 수 있도록 한 방법입니다

NSNumber *inputNumber = [[NSNumber alloc ]initWithDouble:convertValue]; 
NSNumber *resultNumber = [[NSNumber alloc]initWithDouble:result]; 


NSNumberFormatter *formatterResult = [[NSNumberFormatter alloc] init]; 
formatterResult.numberStyle = NSNumberFormatterDecimalStyle; 
NSNumberFormatter *formatterInput = [[NSNumberFormatter alloc] init]; 
formatterInput.numberStyle = NSNumberFormatterDecimalStyle; 

[formatterResult setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatterResult setMaximumFractionDigits:6]; 

[formatterInput setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatterInput setMaximumFractionDigits:6]; 
//These four lines are the one fixing the issue. 


NSString *formattedResultString = [formatterResult stringFromNumber: (NSNumber*)resultNumber]; 
NSString *formattedInputString = [formatterInput stringFromNumber:(NSNumber*)inputNumber]; 






NSString *formelString = [[NSString alloc]initWithFormat: 
         @" %@ %@ =", formattedInputString, convertFromName]; 

formelLabel.text = formelString; 


NSString *resultString = [[NSString alloc]initWithFormat: 
         @" %@ %@",formattedResultString, convertToName]; 
resultLabel.text = resultString; 
1

실수 계산이 정확합니다. 모든 컴퓨터 산술에는 제한된 범위가 있습니다 - 얼마나 많은 자릿수를 나타낼 수 있습니까? 컴퓨터에 의한 인간과 이진 분수의 십진 분파의 사용으로 인해 분수가 부정확 할 경우.

코드에서 float은 정밀도가 6 자릿수이고 범위는 대략 10^-38에서 10^38 인 32 비트 2 진 부동 소수점 숫자입니다. 귀하의 전화 번호는 최대 9 자리입니다.

정확도가 약 15 자리 인 64 비트 이진 부동 소수점 인 double 사유 (및 doubleValue 등)를 사용해보십시오. 원하는대로 번호가 나오지 않을 수도 있습니다. 숫자 형식을 지정하는 방법에 대해 자세히 알아야 할 필요가 있지만 정밀도를 알아야합니다.

더 많은 정밀도와 10 진수 부동 소수점이 필요하면 NSDecimalNumber을보십시오.

자세한 내용은 32-bit floating point64-bit floating point을 참조하십시오.

+0

감사합니다, 플로트 문제를 해결 더블 대신. 나 자신을 생각하지 않는 것에 대해 어리 석을 느낀다. 내가 NSDecimalNumber 물건을 알아낼 때 대답을 받아 들일 것입니다. –

+0

당신이 원한다면 답에 코드를 추가하는 것을 도와 줄 수 있습니다. 그래서이 작업을 더 빨리 끝낼 수 있습니다 :) –

+0

@OscarApeland - 추가 정밀도가 필요하지 않는 한'double'으로 고정하십시오. 'NSDecimalNumber'는 객체 기반이므로 'NSNumber'와 마찬가지로 메모리를 할당/할당 해제합니다. 반면에'double '은 값 기반이므로 메모리 할당이 필요 없습니다. NSDecimalNumber'의 값 기반 형식 인'NSDecimal'이 있습니다. 자세한 내용은 를 참조하십시오. – CRD

관련 문제