2016-05-06 68 views
0

這是我的代碼:UIStepper.value變成科學記數法

@IBAction func stepperChanged(sender: AnyObject) { 
    let stepper = sender as! UIStepper 
    stepper.stepValue = 0.1 
    stepper.minimumValue = 0.0 
    stepper.maximumValue = 1.0 
    print("stepper value: \(stepper.value)") 
} 

當我不停的按着減號按鈕,輸出是:

stepper value: 0.2 
stepper value: 0.1 
stepper value: 1.38777878078145e-16 
stepper value: 0.0 

爲什麼有0.1和0.0之間1.38777878078145e-16

我想知道原因以及如何解決它。

謝謝!

+1

只要把它想成另一種形式的零。 – matt

+2

每當步進器的值發生變化時,爲什麼要重置步進器的「stepValue」,「minimumValue」和「maximumValue」? – rmaddy

+0

@matt謝謝!但我仍然有一個問題: 當值達到minimumValue時,步進器上的減號按鈕不應該是可點擊的,但當值爲「1.38777878078145e-16」時仍然可點擊。減號按鈕僅在值真正變爲「0.0」時才被禁用。我如何防止這種情況? 而且,爲什麼它變成科學記數法而不是變成零? – Brian

回答

4

請嘗試最小值爲0,最大值爲10

override func viewWillAppear(animated: Bool) { 
     sampleUIStepper.minimumValue = 0 
     sampleUIStepper.maximumValue = 10 
     sampleUIStepper.stepValue = 1 
    } 

的UIStepper發件人值轉換爲所需的格式,並使用它。

@IBAction func sampleStepperValueChanged(sender: AnyObject) { 
     let stepper = sender as! UIStepper 

     let convertedValue = (stepper.value/10) as Double 
     print(convertedValue) 

    } 
+0

你能解釋爲什麼這個方法可行,而我的方法不行?謝謝 – Brian

+2

1.38777878078145e-16是一個很好的 近似於所需的零值,並且使用有限精度算法,您可以期待最好的近似值 。 每次添加或減去0.1時,都會累積舍入誤差。 –

1

Double s不準確。

UIStepper.value的類型是Double。並且Double s的精度只有16-17位數。這意味着,在此代碼,result不等於0.1:

let a = 0.3 
let b = 0.2 
let result = a - b 
// result might be 0.1000000000000000007890778643 

所以,當你點擊減號按鈕,某處代碼中有這樣一句話:

value -= stepValue 

由於stepValue也是Double,這是不準確的。發生的情況是,當您第三次單擊該值時,步長值可能等於0.9999999999999999138777878078145。因此,步進的值不爲0

另一種可能的解釋是value是不準確的,它可能是0.1000000000000000861222121021854

記住,編程是不是數學。

如何解決這個問題?

所以你想禁用減號按鈕,當它接近0,對不對?這很容易!

if stepper.value - 0 < 0.0000001 { 
    stepper.value = 0 
} 
+0

感謝您的解釋。但是不準確的情況可能發生在任何時候,我不應該認爲這隻發生在值接近零的時候,對嗎? – Brian