2016-05-06 11 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 

Почему был 1.38777878078145e-16 между 0,1 и 0,0?

Я хочу знать причину и как ее исправить.

Спасибо!

+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