оператор if не работает с дробью, но работает с десятичным эквивалентом
Я пытаюсь решить проблему с моим кодом и сузил ее до моего оператора if, который не работает с дробью.
Приведенный ниже код не работает и возвращает 0
for(float i=0; i <= 1; i += .0001){
t += .0001;
if(t >= 1/440){ // Дробь
t = 0;
}
Serial.println(t*100);
delay(100);
}
Но когда я заменяю 1/440 его десятичным эквивалентом (.0022727), он работает нормально и считает от 0 до 2,2
for(float i=0; i <= 1; i += .0001){
t += .0001;
if(t >= 0.0022727){ // Десятичное
t = 0;
}
Serial.println(t*100);
delay(100);
}
Если бы существовал простой способ использовать дробное значение вместо десятичного, это сделало бы мое приложение очень похожим. Спасибо.
@LB Burkhardt, 👍0
Обсуждение1 ответ
▲ 2
1/440
будет рассматриваться как целочисленное выражение, возвращающее ноль.
Чтобы это работало, сделайте один или оба операнда типами с плавающей запятой. В вашем случае:
if(t >= (float)1 / 440){ //Дробь
t = 0;
}
Или:
if(t >= 1.0/440){ //Дробь
t = 0;
}
,
@Nick Gammon
Смотрите также:
- Цикл While не прерывается
- как отправить аргумент объектам ESP8266WebServer в функции
- Что именно делает препроцессор Arduino?
- Как изменить переменную/скетч с помощью графического интерфейса
- Как написать программу для выполнения двух разных циклов | Задача?
- Обновите атрибут класса с помощью attachInterrupt
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
Всегда представляйте вычисления с плавающей запятой, подобные этому, 1,0/440,0, а не 1/440, чтобы предотвратить их обработку как целочисленные вычисления. Избегайте использования чисел с плавающей запятой в сравнениях, особенно в сравнениях '=='., @6v6gt
@ 6v6gt Пожалуйста, прочитайте [Когда я не должен комментировать?](https://arduino.stackexchange.com/help/привилегии/комментарий). Если вы не запрашиваете разъяснения у автора (или пару других причин, чтобы прокомментировать вопрос), то вместо этого вы **должны опубликовать ответ**., @Nick Gammon
@ 6v6gt Вы можете посмотреть на [это](https://arduino.meta.stackexchange.com/questions/2667/тривиальные-вопросы-должны-быть-не по теме). Я не знаю, будет ли иметь значение то, что он такой старый, но вы можете взвесить это, если у вас есть интерес; Я не. Но я бы хотел, чтобы они приняли решение по этому поводу., @timemage
@NickGammon Одна из проблем с предоставлением формального ответа в таком случае, граничащем с темой (этот может потерпеть неудачу, если применяется часто применяемый тест, «не специфичный для Arduino», и в любом случае он имеет общий вид C/C++) заключается в том, что отвечающий рискует потерять пару баллов Брауни, если кто-то решит утверждать, что это не по теме, и начнет голосовать против вопроса и ответа. Некоторые ответы, на которые я приложил значительные усилия, и ОП не мог знать, что решение проблемы было «не специфичным для Arduino», получили оценку -1., @6v6gt
@ 6v6gt Да, согласен. Я стараюсь игнорировать случайные отрицательные голоса, поскольку есть люди, которым нравится придираться к подобным вещам. Это правда, что это действительно вопрос программирования, но в конце концов у нас есть тег «программирование», поэтому я думаю, что вопросы по программированию — это нормально. Особенно, если новички в Arduino могут подумать, что правила Arduino отличаются от правил C++., @Nick Gammon
«Процесс проектирования и написания исходного кода как части программы (или скетча) для Arduino.». Неясно, относится ли это к заданный вопрос и ответ не дан. И не противоречит тому, что «[Если решение будет одинаковым с Arduino или без него, то это обычно вопрос общего кодирования](https://arduino.stackexchange.com/help/on-topic)». Я не возражаю против вашего желания ответить на него здесь. Но ваше мышление не _очевидно_ поддерживается правилами там, где оно явно _не_ поддерживается правилами., @timemage