-1

float var1 = cashInHandAmount = 4.73000002 があり、単純に var2 = 4.73 とします。

私はこのように試しました:

NSString *floatString = [NSString stringWithFormat:@"%.02f",cashInHandAmount];//it prints 4.73
[self.editcash setMaxValue:[floatString floatValue]];//but it again sets 4.73000002 why?

これに関して私を助けてもらえますか?

4

4 に答える 4

3

%f は単純に出力を丸めます。正確な値 (つまり 4.73) が float 形式で表現されていない場合、float 値を文字列に変換して元に戻すことはできません。したがって、元に戻すと、保存された値 4.73 が float 形式に「丸められ」ます。これは明らかに 4.730…02 です。

財務計算に(バイナリ、IEEE)フロートを使用することはめったにありません。金銭的価値 (金額) は、ほとんどの場合、セントの整数値ですが、ドル (など) の浮動小数点値ではありません。さらに、精度が 2 桁のすべての値が形式に格納できるようにすることを検討してくださいNSDecimalNSDecimalNumber

編集:

float f = 4.73000002;
float rounded = roundf(f * 100.0f) / 100.0f;
NSLog(@"%10.10f", rounded);

出力:

2014-07-01 10:25:48.653 xctest[596:303] 4.7300000191

確認するのは難しいですが、おそらく float は 4.73 を正確に表すことはできません。最も近い表現可能な値は 4.7300000191 です。これは私が言ったことです: 丸められた 10 進数表現は、常に可能な「2 進浮動小数点数」表現であるとは限りません。多くの値でその問題に直面します。

于 2014-07-01T08:21:21.733 に答える
2

これを試して :

    float var1 = 4.73000002;
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.numberStyle = NSNumberFormatterDecimalStyle;
    formatter.maximumFractionDigits = 2;  //Set number of fractional digits

    NSNumber *num = [NSNumber numberWithFloat:var1];

    NSString *roundedNum = [formatter stringFromNumber:num];

    DLOG(@"Answer : %@", roundedNum);
于 2014-07-01T09:48:47.620 に答える
1

他のすべての小数を切り捨てたい場合は、次のような単純なメソッドを宣言できます。

- (float)sanitizeFloat:(float)value
{
    float newValue = [[NSString stringWithFormat:@"%.2f",value] floatValue];
    return newValue;
}

その後

float aFloat = 45.070809;
NSLog(@"%f",[self sanitizeFloat:aFloat]);

あなたの場合:

[self.editcash setMaxValue:[self sanitizeFloat:cashInHandAmount]];

出力は次のようになります。45.070000

于 2014-07-01T08:47:40.953 に答える
0

小数点以下の桁数が固定されている金額を扱う場合は、常にNSDecimalorを使用する必要があります。浮動小数点数NSDecimalNumberは不正確であるため、使用しないでください。

あなたが使用することができます:

-[NSDecimalNumber decimalNumberWithString:]

番号を作成するには、さまざまな方法があります。詳細については、 Apple のドキュメントまたはをNSDecimalNumbers参照してください。NSDecimalNumber.h

于 2014-07-01T08:59:31.137 に答える