2012-07-27 83 views
0

我已經解決了本文中描述的問題,但想了解它的原因(我花了大量時間弄清楚),因爲我已經在下面的「問題」中提出。UIStepper值 - 經過多次迭代後返回的垃圾值

當使用UIStepper調用IBAction方法時,我遇到了遞增和遞減返回值的問題。當我運行和調試應用程序時,我可以上下移動,並且日誌語句總是反映了預期的步進值,但是當我迭代地增加0.1,0.2,0.3時,然後下降,當我回到0.0時,當我執行if測試,調試器中顯示的changeValue的值是垃圾,測試未導致== 0.0的真實情況。請注意,如果我只增加到0.2,然後回退到0.0,那麼changeValue的if測試工作。只有當我達到0.3時,當我回到0.0時,我得到了垃圾值。

最初,遞增步進我設置stepValue屬性爲:

viewStepper.stepvalue = 0.1 

和方法加緊0.3並返回到後0.0 0.0返回的垃圾值。

當我改變了分配:解決

viewStepper.stepValue - 0.1f 

問題 - changeValue返回預期的0.0 changeValue我如果測試也不管迭代次數的預期方法的工作。

問題:1)我得到這個,但爲什麼如果stepValue是一個double值,賦值需要明確包含「f」,對我更加好奇2)爲什麼我的方法測試沒有「f」當它分配viewStepper.stepValue屬性時兩個步迭代,但返回垃圾的changeValue當我做三個迭代,然後返回到0.0?

下面是該方法的核心我測試:

- (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),因此您價值的完整性延續了一些計算。如果您確實需要跟蹤細粒度的精確十進制值,執行下列操作之一:

  • 使用Decimal數據類型
  • 跟蹤標的增量的整數類型,但目前作爲一個小數。在你的例子中,如果你的步長總是0.1,那麼你可以跟蹤的步數作爲一個整數,但將步數除以10得到當前的有用值。
+0

瞭解。謝謝。 – larick 2012-07-27 19:55:47