оператор 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);
}

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

, 👍0

Обсуждение

Всегда представляйте вычисления с плавающей запятой, подобные этому, 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


1 ответ


2

1/440 будет рассматриваться как целочисленное выражение, возвращающее ноль.

Чтобы это работало, сделайте один или оба операнда типами с плавающей запятой. В вашем случае:

 if(t >= (float)1 / 440){ //Дробь
   t = 0;
 }

Или:

 if(t >= 1.0/440){ //Дробь
   t = 0;
 }
,