Математика не подходит прямо в NSInteger Objective C
Итак, у меня есть базовое математическое уравнение, которое я пытаюсь выполнить в программировании.
NSInteger testValue = (self.waveform.zoomStartSamples/self.waveform.totalSamples)*100;
Self.waveform.zoomStartSamples - это @property (неатомный, назначить) unsigned long int zoomStartSamples;
self.waveform.totalSamples - это @property (nonatomic, assign, readonly) unsigned long int totalSamples;
Вот NSLog's я бегу
NSLog(@"Value of testValue is %ld", (long)testValue);
NSLog(@"zoomStartSamples are %lu", self.waveform.zoomStartSamples);
NSLog(@"totalSamples are %lu", self.waveform.totalSamples);
И вот результат, который я получаю:
Значение testValue равно 0 zoomStart Примеры 1033554 всегоПриборы 4447232
Я не думаю, что значение testValue должно приближаться к 0. Есть идеи?
В конечном итоге я хотел бы передать значение другой переменной, чтобы использовать его в другом месте. Благодарю.
2 ответа
Это потому что zoomStartSamples/totalSamples
приводит к int 0, поэтому 0*100 = 0, попробуйте использовать zoomStartSamples * 100/totalSamples
вместо.
Это природа целочисленной математики. 1033554 / 4447232 = 0,23240388628252. Однако это значение не может быть представлено как целое число. Это между 0 и 1. В C результат обрезается до 0. Затем вы умножаете это на 100, что все равно дает 0.
Если вы хотите дробные значения, вам нужно использовать математику с плавающей точкой. Вы можете преобразовать результат обратно в целое число в конце. Во многих случаях компилятор выполняет это окончательное преобразование автоматически. Например:
NSInteger testValue = (self.waveform.zoomStartSamples/(double)self.waveform.totalSamples)*100;
Приведя одно подвыражение к double
деление выполняется с double
s. Числитель автоматически повышается до double
, Результатом является double
, Аналогично умножение выполняется с double
s; 100
повышен до double
, Когда double
Результат присваивается целочисленной переменной, он усекается.