округления при делении\умножении
- Войдите на сайт для отправки комментариев
Пнд, 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 где? :)
Ой, блин!
Спасибо! С меня пиво. :)