Objective-c divide всегда возвращает 0
Что-то действительно странное происходит.
float p1 = (6 / 100);
NSLog(@"p1 = %f", p1);
С этими двумя строками кода я получаю следующий вывод:
p1 = 0,000000
Почему простой девайс со статическими числами не работает! У меня так много работы, чтобы разобраться с делом не работающим! Что он чертовски, я с ума сошел?
Ответы
Ответ 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;