1

編集:修正されました、これが私が将来の参照のためにそれをした方法です:

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桁を超えると小数が表示されないという問題があります。

次の図で説明されている問題:

ここに画像の説明を入力してください<-動作していますが、小数点以下3桁に短縮されています。(そして、数学的に正しく行われる切り上げ)

そして問題:(右端の写真は正しい)

ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください

ご覧のとおり、下の画像は小数点を完全に無視しています。これを正しく機能させるには、どのコードを追加/変更する必要がありますか?

関連するコードは次のとおりです。

[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;


}

問題/修正はこのコードにあると思います。

4

2 に答える 2

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;
于 2012-10-30T18:22:28.173 に答える
1

実際の算術は正確です。すべてのコンピュータ演算には制限された範囲があります-何桁を表すことができますか。そして、私たち人間による小数の派閥の使用とコンピューターによる二進分数の使用による分数の不正確さの場合。

使用しているコードfloatでは、精度が10進数で約6桁で、範囲がおよそ10^-38から10^38の32ビットの2進浮動小数点数です。あなたの番号は最大9桁です。

小数点以下15桁程度の精度の64ビット2進浮動小数点であるdoublethoughtout(など)を使用してみてください。doubleValueそれでも、数値が希望どおりに表示されない場合があります。そのためには、数値のフォーマット方法を詳しく調べる必要がありますが、目的の精度を得る必要があります。

より高い精度と10進浮動小数点が必要な場合は、NSDecimalNumberを確認してください。

詳細については、 32ビット浮動小数点および64ビット浮動小数点を参照してください。

于 2012-10-24T19:00:33.183 に答える