Objective-C Целочисленная арифметика

Я пытаюсь вычислить некоторые числа в приложении iPhone.

int i = 12;
int o = (60 / (i * 50)) * 1000;

Я ожидал бы, что o будет равен 100 (это миллисекунды) в этом примере, но он равен 0, как показано NSLog (@ "% d", o).

Это также равно 0.

int o = 60 / (i * 50) * 1000;

Это равно 250 000, что является прямой математикой слева направо.

int o = 60 / i * 50 * 1000;

Что летит над моей головой?

Спасибо,
Ник

Ответ 1

В Objective-C / выполняется целочисленное деление по целым аргументам, поэтому 4/5 усекается до 0, 3/2 усекается до 1 и так далее. Вероятно, вы захотите перенести некоторые из ваших чисел в формы с плавающей запятой перед выполнением деления.

Вы также сталкиваетесь с проблемами с приоритетом. В выражении

60 / (i * 50) * 1000

сначала вычисляется член внутри скобок, поэтому 60 делится на 600, что дает результат 0. В

60 / i * 50 * 1000

первая операция состоит в том, чтобы разделить 60 на 12, что дает результат 5, а затем выполняется умножение.

Ответ 2

Целое число, деленное на целое число, является целым числом.

поэтому 60/600 не 0.1, это 0.

Вставьте (или объявите) некоторые вещи как float.

Ответ 3

Заменить:

int o = (60 / (i * 50)) * 1000;

с:

int o = 1200/i;

Ответ 4

Выполняет целочисленную математику. 60/(12 * 50) составляет 0,1, усекает до 0.

Должна работать, если вы вынуждаете с плавающей запятой, а затем отбрасываете целое число.

int o = (int)(60.0 / ((double) i / 50.0) * 1000.0;

Наверное, не обязательно делать все двойным.

Ответ 5

По порядку приоритета операция:

60 / (12 * 50) 

выполняется перед умножением на 1000.

Это значение меньше 1 и преобразуется в int, который усекает его до 0. И 0 раз что-нибудь есть 0.

Используйте float или сначала умножьте на 1000, чтобы убедиться, что вы не закончили распространение 0 в своих вычислениях.

Ответ 6

Все операции в вашем выражении выполняются в целочисленной арифметике, что означает, что дробная часть каждого промежуточного результата усекается. Это означает, что если вы разделите меньшее целое на большее целое число, вы всегда получите 0.

Чтобы получить результат, который вы хотите, вы должны либо убедиться, что операции выполняются в определенном порядке, либо вы должны использовать поплавки. Например, результат

int o = (60.0 / (i * 50.0)) * 1000.0;

должно быть o = 100.

Ответ 7

Я думаю, вам нужно использовать float вместо int. Он будет работать так, как вы хотите! Дает вам ответ и в десятичных словах.