Цель c делением двух целых - PullRequest
6 голосов
/ 10 декабря 2011

Я пытаюсь создать float, разделив две int в моей программе.Вот то, что я ожидал:

1/120 = 0,00833

Вот код, который я использую:

float a = 1 / 120;

Однако он не дает мнерезультат я бы ожидал.Когда я распечатываю это, я получаю следующее:

inf

Ответы [ 4 ]

12 голосов
/ 10 декабря 2011

Выполните следующие действия

float a = 1./120.
7 голосов
/ 10 декабря 2011

Вы должны указать, что хотите использовать математические вычисления с плавающей запятой.

Есть несколько способов сделать это:

  • Если вы действительно заинтересованы в делении двух констант, вы можете указать, что вы хотите использовать математические вычисления с плавающей точкой, сделав first константу с плавающей точкой (или double). Все, что нужно, это десятичная точка.

    float a = 1./120;
    

    Вам не нужно делать вторую константу плавающей, хотя это ничего не повредит.

  • Честно говоря, это довольно легко пропустить, поэтому я бы предложил добавить конечный ноль и некоторый интервал.

    float a = 1.0 / 120;
    
  • Если вы действительно хотите сделать математику с целочисленной переменной, вы можете набрать приведение:

    float a = (float)i/120;
    
5 голосов
/ 11 декабря 2011
float a = 1/120;
float b = 1.0/120;
float c = 1.0/120.0;
float d = 1.0f/120.0f;

NSLog(@"Value of A:%f B:%f C:%f D:%f",a,b,c,d);

Output: Value of A:0.000000 B:0.008333 C:0.008333 D:0.008333

Для переменной с плавающей точкой a: int / int возвращает целое число, которое вы присваиваете переменной с плавающей точкой и печатаете ее таким образом, 0,0000000

Для переменной с плавающей запятой b: float / int возвращает значение с плавающей запятой, присваивая ей значение float и печатая ее0,008333

Для переменной с плавающей запятой c: float / float дает float, поэтому 0,008333

Последний является более точным с плавающей точкой.Предыдущие имеют тип double: все значения с плавающей запятой хранятся как типы данных double, если только за значением не следует 'f', чтобы указать плавающее значение, а не double.

4 голосов
/ 11 декабря 2011

В C (и, следовательно, также в Objective-C) выражения почти всегда оцениваются без учета контекста, в котором они появляются.

Выражение 1 / 120 является делением двух int операндов, так что это дает int результат.Целочисленное деление усекает, поэтому 1 / 120 дает 0.Тот факт, что результат используется для инициализации объекта float, не меняет способ оценки 1 / 120.

Иногда это может быть нелогичным, особенно если вы привыкли к тому, как калькуляторы обычно используютсяработать (они обычно хранят все результаты с плавающей запятой).

Как и в других ответах, чтобы получить результат, близкий к 0,00833 (что не может быть точно представлено, кстати), вам нужно сделатьделение с плавающей запятой, а не целочисленное деление, путем создания одного или обоих операндов с плавающей запятой.Если один операнд является плавающей точкой, а другой - целым числом, целочисленный операнд сначала преобразуется в число с плавающей точкой;нет прямой операции с плавающей запятой целочисленным делением.

Обратите внимание, что, как говорится в комментарии @ 0x8badf00d, результат должен быть 0.Что-то еще должно быть не так, чтобы напечатанный результат был inf.Если вы покажете нам больше кода, предпочтительно небольшую законченную программу, мы поможем разобраться в этом.

(Существуют языки, в которых целочисленное деление дает результат с плавающей запятой. Даже в этих языках оценка нене обязательно зависит от контекста. Python версии 3 является одним из таких языков; C, Objective-C и Python версии 2 не являются.)

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