0

この投稿で説明されているように、抱えていた問題を解決しましたが、以下の「質問」で提起したように、その理由を理解したいと思います (これを理解するのにかなりの時間を費やしています)。

UIStepper を使用して IBAction メソッドを呼び出すときに返される値の増減に問題がありました。アプリを実行してデバッグすると、ステップアップとステップダウンが可能で、ログステートメントは常に意図したステッパー値を反映していましたが、0.1、0.2、0.3 と繰り返しステップアップし、0.0 に戻ったときにステップダウンしました。テストの場合、デバッガーに表示される changeValue の値はガベージであり、テストは== 0.0の真の条件になりませんでした。0.2 まで上げてから 0.0 に戻した場合、changeValue の if テストが機能したことに注意してください。0.0 に戻ったときにガベージ値を取得したのは、0.3 にステップアップしたときだけです。

最初に、ステッパーをインクリメントするために、stepValue プロパティを次のように設定します。

viewStepper.stepvalue = 0.1

メソッドは、0.3 までステップアップして 0.0 に戻った後、ガベージ値を 0.0 で返しました。

割り当てを次のように変更したとき:

viewStepper.stepValue - 0.1f

問題が解決しました - changeValue は、if テストに対して意図した 0.0 changeValue を返し、反復回数に関係なく、メソッドは意図したとおりに機能します。

質問: 1) なんとなくわかりますが、stepValue が double の場合、代入値に "f" を明示的に含める必要があるのはなぜでしょうか? 2ステップの反復を行ったときにviewStepper.stepValueプロパティを割り当てましたが、 3回の反復を行ってから0.0に戻ったときにchangeValueのガベージを返しましたか?

これが私がテストしていた方法の核心です:

- (IBAction)doStepper:(UIStepper *)sender
{
   double changeValue = [sender value];
   NSLog(@"(double)change value %f", (double)changeValue);
   NSLog(@"sender value:%0.1f", [sender value]);

   if ((double)changeValue == 0.0) {
       if (!something) {
           // do stuff
       }
   // do stuff

   } else {
        // do stuff
   }
}
4

1 に答える 1

2

浮動小数点の丸め誤差の典型的なケースのように思えます。一般的なルールは、浮動小数点値が等しいかどうかを比較しないことです ( ==)。2 番目のケースでは、数値の精度を (doubleデフォルトの単精度ではなくa にfloat) 上げたので、値の整合性が数計算長く続きました。きめの細かい正確な 10 進数値を追跡する必要がある場合は、次のいずれかを実行します。

  • Decimalデータ型を使用する
  • 基本的な増分を整数型で追跡しますが、小数として表示します。あなたの例では、ステップが常に正確に 0.1 である場合、ステップ数を整数として追跡できますが、ステップ数を 10 で割って現在の有用な値を取得できます。
于 2012-07-27T19:05:46.237 に答える