Разделить два целых числа в результате чего получится число с плавающей запятой
Предположим, я хочу разделить две целочисленные переменные и поместить результат в float. Чтобы предотвратить целочисленное деление, нужно ли мне программировать так:
int i = 6312;
int j = 258;
float f;
f = i;
f = i/j;
Или я могу написать простую программу, как показано ниже, и компилятор позаботится о том, чтобы она обрабатывалась "правильно":
f = i/j;
@PimV, 👍4
Обсуждение2 ответа
Лучший ответ:
Приведите целые числа к плаванию, прежде чем выполнять вычисления.
float f = float(i) / float(j);
или
float f = (float) i / (float) j;
Всегда имейте в виду, как должен быть выполнен расчет, поэтому компилятор будет делать то, что вы хотите.
или float f = (float) i / j;
, @Juraj
@Juraj, это зависит от компилятора для вычисления float, когда задействованы float и int. Я предпочитаю, чтобы кто-то читал код и компилятору было ясно, что происходит, не задумываясь об этом., @Jot
Поскольку 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;
Да, это сработает. Однако, несмотря на то, что это кажется довольно элегантным, это может вызвать путаницу позже, когда кто - то другой изучит код-если только вы не добавите комментарий, объясняющий почему.
вероятно, лучше всего сохранить код простым и очевидным (для целей отладки), если только вы намеренно не собираетесь запутать код.
- Объяснить функцию pulseIn с помощью arduino и ультразвукового датчика
- Как применить таймер к команде AnalogWrite для Arduino
- Использование millis() для создания временной последовательности событий
- Как запрограммировать Esp8266 удаленно через Wi-Fi?
- Тройное нажатие кнопки "Сброс", чтобы удалить существующую программу
- Использование двух светодиодов с одной кнопкой
- Помогите новичку, понятия не имею о программировании, начал только 2 дня назад
почему бы вам не провести тест?, @jsotola
Нет ли опечатки в вашем первом блоке кода? Вы хотели написать
f = f/j;
? В противном случае (а) зачем беспокоиться о назначенииf = i;
? и (б) последняя строка первого блока точно такая же, как и строка во втором блоке... Так что вопрос не имеет особого смысла... если только вы не допустили опечатку..., @Greenonline@Greenonline: вы правы, в первом блоке кода я должен был написать f = f/j;, @PimV