Разделить два целых числа в результате чего получится число с плавающей запятой

programming-sequence

Предположим, я хочу разделить две целочисленные переменные и поместить результат в float. Чтобы предотвратить целочисленное деление, нужно ли мне программировать так:

    int i = 6312;
    int j = 258;
    float f;
    f = i;
    f = i/j;

Или я могу написать простую программу, как показано ниже, и компилятор позаботится о том, чтобы она обрабатывалась "правильно":

    f = i/j;

, 👍4

Обсуждение

почему бы вам не провести тест?, @jsotola

Нет ли опечатки в вашем первом блоке кода? Вы хотели написать f = f/j;? В противном случае (а) зачем беспокоиться о назначении f = i;? и (б) последняя строка первого блока точно такая же, как и строка во втором блоке... Так что вопрос не имеет особого смысла... если только вы не допустили опечатку..., @Greenonline

@Greenonline: вы правы, в первом блоке кода я должен был написать f = f/j;, @PimV


2 ответа


Лучший ответ:

4

Приведите целые числа к плаванию, прежде чем выполнять вычисления.

float f = float(i) / float(j);

или

float f = (float) i / (float) j;

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

,

или float f = (float) i / j;, @Juraj

@Juraj, это зависит от компилятора для вычисления float, когда задействованы float и int. Я предпочитаю, чтобы кто-то читал код и компилятору было ясно, что происходит, не задумываясь об этом., @Jot


1

Поскольку Arduino - это C++, вы действительно должны использовать статическое приведение, чтобы быть технически точным. Однако для кода Arduino это, вероятно, не имеет большого значения.

Так что либо

float f = static_cast< float >(i) / static_cast< float >(j);

или

float f = static_cast< float >(i) / j;

Примечание: Использование статического приведения для каждого операнда, а не только для одного, полезно для подавления любых предупреждений о потере точности при преобразовании int в float, который обычно должен образовывать округленный float для больших значений int.

См.C++ int float casting для получения дополнительной информации.


Просто чтобы добавить к ответу Jot: строго говоря, следует отметить, что (float) - это C, тогда как float () - это C++.


Кроме того, как вы хотели написать в своем вопросе:

int i = 6312;
int j = 258;
float f;
f = i;
f = f/j;

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

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

,