2016-05-06 10 views
0

Dies ist mein Code:UIStepper.value wird die wissenschaftliche Notation

@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)") 
} 

Wenn ich Drücken der Minus-Taste gehalten wird, der Ausgang war:

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

Warum gab es 1.38777878078145e-16 zwischen 0,1 und 0,0?

Ich möchte den Grund kennen und wie man es beheben kann.

Danke!

+1

Denken Sie einfach an es als eine andere Form von Null. – matt

+2

Warum setzen Sie die StepValue-, MinimumValue- und MaximumWerte des Steppers jedes Mal zurück, wenn sich der Wert des Steppers ändert? – rmaddy

+0

@matt Danke! aber ich habe noch eine Frage: Die Minus-Taste auf Stepper sollte nicht anklickbar sein, wenn der Wert MinimumValue erreicht, aber es ist immer noch anklickbar, wenn der Wert "1.38777878078145e-16" ist. Die Minus-Schaltfläche wird nur deaktiviert, wenn der Wert wirklich 0,0 ist. Wie verhindere ich das? Und warum wird es wissenschaftliche Notation und wird nicht einfach zu Null? – Brian

Antwort

4

Bitte versuchen Minimalwert als 0 und Maximalwert als 10.

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

des Absenders Wert erforderliche Format des UIStepper konvertieren und nutzen.

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

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

    } 
+0

Können Sie erklären, warum das funktioniert, während mein Ansatz nicht funktioniert? Danke – Brian

+2

1.38777878078145e-16 ist eine ausgezeichnete Annäherung an den gewünschten Wert von Null, und eine hervorragende Näherung ist das Beste, was Sie jemals hoffen können, mit endlicher Genauigkeit Arithmetik. Sie sammeln Rundungsfehler jedes Mal, wenn Sie 0,1 addieren oder subtrahieren. –

1

Double s sind nicht präzise.

Der Typ UIStepper.value ist Double. Und Double s Präzision ist nur 16 bis 17 Ziffern. Dies bedeutet, dass in diesem Code result nicht gleich 0,1:

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

Also, wenn Sie die Minus-Taste klicken, irgendwo im Code gibt diese Aussage:

value -= stepValue 

Seit stepValue ist auch ein Double, ist es nicht präzise. Was passiert, ist, dass der Schrittwert gleich 0.9999999999999999138777878078145 sein kann, wenn Sie das dritte Mal klicken. Daher Wert der Schritt ist nicht 0.

Eine weitere mögliche Erklärung ist, wäre, dass value nicht genau ist, könnte es sein, 0,1000000000000000861222121021854

Denken Sie daran, Programmierung nicht Mathematik ist.

Wie löst man dieses Problem?

Sie wollen also die Minus-Taste deaktivieren, wenn es nahe 0 ist, oder? Es ist einfach!

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

danke für die Erklärung. Aber die Ungenauigkeit kann jederzeit passieren, ich sollte nicht annehmen, dass dies nur passiert, wenn der Wert nahe bei Null liegt, oder? – Brian

Verwandte Themen