Итак, я пытаюсь преобразовать значение UISlider в целое число, чтобы использовать его в качестве индекса для получения значения из NSArray, но умножение значения ползунка иногда дает неожиданный результат.
int index = self.moveHistoryLabelSlider.value * 100;
Результат хороший для первых нескольких, но когда он достигает 0,15, он начинает давать другой результат. Вот NSLog для slider.value и slider.value*100:
slider value = 0.150000
slider * 100 = 14.999999
Это происходит и с другими числами с плавающей запятой, например, 0,19 * 100 дает 19,999998. Как это исправить?
Эта проблема характерна для Floating Point Numbers
(https://floating-point-gui.de/basic/). Вы можете использовать два простых подхода для минимизации ошибки округления:
// Float calculation
float value = 0.15; // 0.150000006
float multiplier = 100; // 100
NSLog(@"%f", value * multiplier); // 15.000001
// Convert float to integers and back
int precision = 100;
int intValue = value * precision; // 15
float result = (intValue * (int)multiplier) / (float)precision;
NSLog(@"%f", result); // 15.000000
NSDecimalNumber
для расчетаNSDecimalNumber* decimalValue = [[NSDecimalNumber alloc] initWithDecimal:@(value).decimalValue]; // 15 x 10^-2
NSDecimalNumber* decimalMultiplier = [[NSDecimalNumber alloc] initWithDecimal: @(multiplier).decimalValue]; // 10 x 10^2
NSDecimalNumber* decimalResult = [decimalValue decimalNumberByMultiplyingBy:decimalMultiplier];
NSLog(@"%f", decimalResult.floatValue); // 15.000000
См. stackoverflow.com/questions/2667130/how-to-round-cgfloat вам нужно округлить число