Я добавляю общий ответ на ваш запрос в случае изменения номера шага с 0,1 на 0,01 или 0,001.
Первый - упростить кейс, чтобы можно было вызывать @IBAction без путаницы.
@IBAction func oversStepper(_ sender: UIStepper) {
let myValue : MyFloat = MyFloat(Float(sender.value))
sender.value = myValue.value
displayOversLabel.text = String(format: "%.1f", sender.value)
}
MyFloat здесь играет роль валидатора чисел.значение UIStepper может быть исправлено объектом MyFloat.
Следующий вопрос - Float можно сравнить с помощью метода точного управления.Другими словами, точность числа с плавающей запятой может быть достигнута путем ограничения абсолютного разности между числом и фактическим числом, таким как abs (ab) <точность (1e-4), поэтому мы знаем, что они достаточно близки. </p>
Исходя из этого предположения, создайте MyFloat и запустите testCases следующим образом:
let presicion: Float = 1e-4
struct MyFloat {
private var val: Float = 0
init(_ v: Float){value = v}
var value : Float {
get{ return val}
set{
let ro = newValue.rounded()
let ground = newValue.rounded(FloatingPointRoundingRule.towardZero)
val = (trunc(newValue) == round(newValue) || abs((ground + ro) / 2.0 - newValue) < presicion ) ? newValue :
(abs(val - ro) < presicion) ? (ground + ro) / 2.0 : ro
}
}
static func +=(left: inout MyFloat, right: Float){
left.value = left.value + right
}
static func -=(left: inout MyFloat, right: Float){
left.value = left.value - right
}
}
//naive testCases
var myFloat = MyFloat(10.0)
myFloat += 0.1; assert(abs( myFloat.value - 10.1) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 10.2) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 10.3) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 10.4) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 10.5) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 11.0) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 11.1) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 11.2) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 11.3) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 11.4) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 11.5) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 12.0) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 12.1) < presicion);
myFloat += 0.1; assert(abs( myFloat.value - 12.2) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 12.1) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 12.0) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 11.5) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 11.4) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 11.3) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 11.2) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 11.1) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 11.0) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 10.5) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 10.4) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 10.3) < presicion);
myFloat -= 0.1; assert(abs( myFloat.value - 10.2) < presicion);
Преимущество этого подхода заключается в том, что значение шага может быть гораздо более точным, как 0,001 без какого-либо нового кода, итолько один параметр требует внимания: точность.(например, точность = 1e-6 даст неправильный ответ в этом случае.)
Кстати, этот ответ также применяется к отрицательным значениям, маскируя диапазон (-1 + n, -0,5 + n), n <= 0. </p>