округления при делении\умножении
- Войдите на сайт для отправки комментариев
Пнд, 10/06/2019 - 02:45
Ребята, я чет не догоняю - написал такую функцию
uint16_t aprt,First = 11; uint16_t aprtLast =326; void formatBD() { uint16_t result = 0; lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("Formating EEPROM..")); Serial.print(F("Formating BD in EEPROM...")); for (uint16_t i = 0; i < (aprtLast - aprtFirst); i++) { aprt.number = i + conf.aprtFirst; for (byte x = 0; x < countTlfns; x++) { aprt.tlfn[x] = 0; } for (byte y = 0; y < countCards; y++) { aprt.card[y] = 0; } // EEPROM_put(aprtAddress(i), aprt); result = i % 10; if (result == 0)Serial.print(F("#")); lcd.setCursor(0, 1); lcd.print(i / (float)((aprtLast - aprtFirst) / 100)); lcd.write('%'); lcd.print(F(" ")); } Serial.println(); lcd.setCursor(0, 1); //tone(Buzer, 4000, 250); lcd.print(F("DONE! ")); delay(1000); }
на LCD1602 (не суть) получаю 102-104%, в зависимости от значений aprtFirst и aprtLast. В чем прикол?
пробовал округлять деление и вверх, и вниз до целого, пробовал приводить к int. Без разницы. Как так-то?
на LCD1602 (не суть) получаю 102-104%, в зависимости от значений aprtFirst и aprtLast. В чем прикол?
Все правильно. Выражение в скобке (float)((aprtLast - aprtFirst) / 100) считается по правилам арифметики целых чисел и равно целому числу 3. То, что вы после этого приводите его к float - на результат уже не влияет. Максимальное значение переменной i - 314. Вот и получается в итоге 314 / 3 = 104
Хотите, чтобы первая скобка считалась как вещественное число - перепишите выражение так:
перепишите выражение так:
вроде, достаточно:
вроде, достаточно:
а переменная i где? :)
Ой, блин!
Спасибо! С меня пиво. :)