質問

私はこの記事で説明されているように私が持っていたという問題を解決しましたが、私が下の「質問」で提起されたようにそれの理由を理解したいのですが(私はこれを考えてください)。< / P>

Uistepperを使用してibactionメソッドを呼び出すときに返される値のインクリメントとデクリメントに問題がありました。私が実行してデバッグしたアプリを上下に進み、常に を反映していたが、私が0.1,0.2を繰り返し0.2、その後0.3を維持し、そして後退したとき、それから降りる0.0に、IFテストを実行した場合、デバッガに表示されているChangeValueの値はごみで、テストには== 0.0 の真の条件が得られませんでした。 0.2までのみステップ0.0に戻った場合、ChangeValueのIFテストは処理されました。私が0.0に戻ったときにゴミの価値を得たのは、私が0.3を得たときのみです。

最初に、ステッパーを増やすにはStepValueプロパティを次のように設定します。

viewStepper.stepvalue = 0.1
.

とメソッドは0.3までステップ0.0に戻って0.0でゴミ値を返し、0.0に戻ります。

割り当てを変更したとき:

viewStepper.stepValue - 0.1f
.

問題解決済み - ChangeValueは、私のIFテストのために意図された0.0の変更valueを返し、そのメソッドは反復回数に関係なく意図したとおりに機能します。

質問:1)これを入手してくださいが、StepValueが二重であるかどうかは、「F」を明示的に含める必要があります。 f " 2 ステップの反復のときにViewStepper.StepValueプロパティを割り当てるときは、 3 反復を行ったときにChangeValueのためにゴミを返し、次に0.0に戻りますか?< / P>

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

- (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
   }
}
.

役に立ちましたか?

解決

浮動小数点丸め誤差の古典的な場合のように聞こえます。一般的な規則は、平等(==)の浮動小数点値を比較しません。2番目のケースでは、(デフォルトの単精度doubleではなく、floatに)あなたの数字の精度を上げましたので、値の整合性は数量の計算に長持ちしました。微細な正確な10進数値を追跡する必要がある場合は、次のいずれかを実行してください。

  • Decimalデータ型
  • を使用
  • 基礎となる増分を整数型で追跡しますが、それを小数点以下のように紹介します。あなたの手順では、あなたのステップが常に0.1の場合、の数を整数として追跡することができますが、現在の有用な値を取得するには、ステップ数を10分割できます。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top