Математика не подходит прямо в 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деление выполняется с doubles. Числитель автоматически повышается до double, Результатом является double, Аналогично умножение выполняется с doubles; 100 повышен до double, Когда double Результат присваивается целочисленной переменной, он усекается.

Другие вопросы по тегам