1

おそらく明らかな何かが欠けています (まだ Objective-C について学んでいます!) が、何らかの理由で NSString 変数の 1 つがifステートメントに null 値を持っていて、その理由がわかりません。

NSLog への出力さえありますが、なぜこのように動作するのかまだわかりません。

基本的に、ユーザーはテキスト フィールド ( itemWeight ) に金額を入力します。このifステートメントは入力を検証し、結果に応じてアラートを表示します。問題は 0.751 が入力された場合のみのようです。他の量 (0.750、0.749、0.752、0.753 など) を入力すると、期待どおりに機能します。

関連するコード サンプルは次のとおりです...

.h ファイル:

@property (strong, nonatomic) IBOutlet UITextField *itemWeight;

.m ファイル:

NSString *rawWeightText = itemWeight.text;
float convertedWeightText = rawWeightText.floatValue;

NSString *weightMessage;

if (convertedWeightText <= 0.750)
{
    weightMessage = @"under 0.750";
}
else if (convertedWeightText >= 0.751)
{
    weightMessage = @"0.751 or over";
}

UIAlertView *alert = [[UIAlertView alloc]
                      initWithTitle: @"Error"
                      message: weightMessage
                      delegate: nil
                      cancelButtonTitle:@"OK"
                      otherButtonTitles:nil];
[alert show];

私が間違っている/私がするのを忘れたアイデアは大歓迎です、ありがとう!

4

3 に答える 3

5

コードに from の範囲がない場合の if-else の条件を見る0.750 to 0.751.

浮動小数点値の比較には注意が必要です。0.751可能性を考えるべき0.75099999...

次のループでは、結果は 100 ではなく 99.999046 です。追加を続けると精度が低下します。

float a= 0.1f;
float result = 0.f;
for(int i = 0; i<1000; i++)
{
    result += 0.1f;
}

printf("result:%f", result); //99.999046

したがって、一般に、これらの式の比較は推奨されません。

if (result == expectedResult)

比較するには、次のメソッドを記述することをお勧めします。

bool AlmostEqualRelative(float A, float B, float maxRelativeError)
{
    if (A == B)
        return true;
    float relativeError = fabs((A - B) / B);
    if (relativeError <= maxRelativeError)
        return true;
    return false;
}

詳細については、こちらをお読みください

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

また、この wiki を読む必要があります。

http://en.wikipedia.org/wiki/Floating_point

http://en.wikipedia.org/wiki/Denormal_number

于 2012-08-11T14:49:35.817 に答える
1

多くの場合、10 進数値は 2 進数では正確に表現できません。ユーザーが 0.751 を入力すると、返される実際のフロートは 0.750999942 のようにわずかに小さくなる可能性があります。値をログに記録して、何が起こっているかを確認してください。

于 2012-08-11T15:00:42.440 に答える
0

浮動小数点数の実際の動作に驚くプログラマは、あなたが初めてではありません。

実際には、浮動小数点の詳細よりも 2 進の 10 進数の問題です。

小数部分が 3 桁しかない 0.751 を 2 進数に変換してみてください。

簡単に言うと、0.751 は浮動小数点数 (浮動小数点数は 23+1 ビットの精度しかありません) の -1 のバイナリ指数と 1.10000000100000110001001 の仮数として表されます。

つまり、10 進数では、指数は -1、仮数は 1.5019999742507935 です。

したがって、2^-1 * 1.5019999742507935 = 0.7509999871254 となり、if のテストに合格しません。

于 2012-08-11T15:05:02.043 に答える