Подтвердить что ты не робот

Objective-c divide всегда возвращает 0

Что-то действительно странное происходит.

float p1 = (6 / 100);
NSLog(@"p1 = %f", p1);

С этими двумя строками кода я получаю следующий вывод:

p1 = 0,000000

Почему простой девайс со статическими числами не работает! У меня так много работы, чтобы разобраться с делом не работающим! Что он чертовски, я с ума сошел?

4b9b3361

Ответ 1

Эти константы являются целыми числами, поэтому математика выполняется с целочисленной математикой. Попробуйте

float p1 = (6.0 / 100.0);

edit — @Stephen Canon мудро указывает, что, поскольку "p1" является float, нет никаких оснований не делать все вычисление как float:

float p1 = (6.0f / 100.0f);

Теперь, поскольку эти вещи являются обеими константами, я бы предположил, что есть действительно хороший шанс, что работа будет выполнена компилятором в любом случае. Также верно, что, поскольку на некоторых современных машинах (то есть архитектуре Intel) набор инструкций процессора с плавающей запятой является достаточно странным, что что-то, что кажется очевидной "оптимизацией", может быть или не работать таким образом. Наконец, я полагаю, что могло бы быть так, что выполнение операции с константами float могло (в некоторых случаях) дать другой результат, выполняющий операцию с double значениями, а затем кастинг на float, который, если бы истина, вероятно, была бы лучший аргумент для решения так или иначе.

Ответ 2

Так как оба эти числа считаются целыми числами на компьютере, выполняется целочисленная математика и возвращается целое число без десятичных знаков, которое равно 0 (0,06), затем преобразуется в float и сохраняется в переменной p1.

По меньшей мере одно число (или оба) должно быть float для выполнения математики с плавающей запятой, когда вы добавляете десятичную цифру в число, которое вы указываете компьютеру, что константа является числом с плавающей запятой.

float p1 = (6.0 / 100);

Или вы можете его придумать

float p1 = ((float)6 / 100);

Ответ 3

Ваше назначение содержит целочисленное деление, которое возвращает ноль, если число, которое вы делите на большее. Вероятно, вы хотели:

float p1 = (6.0f / 100.0f);

Ответ 4

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

int x = 5;
int y = 7;

float z = x / y;  // always 0

Исправить:

float z = 1.0 * x / y;

Примечание:, если вы измените порядок, это решение не будет работать.

Edit: В соответствии с этим ответом предыдущий ответ Вы можете использовать этот

float z = (float) x / y;