округления при делении\умножении

kostyamat
Offline
Зарегистрирован: 16.11.2017

Ребята, я чет не догоняю - написал такую функцию

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. Без разницы. Как так-то?

 

b707
Онлайн
Зарегистрирован: 26.05.2017

kostyamat пишет:

на LCD1602 (не суть) получаю 102-104%, в зависимости от значений aprtFirst и aprtLast.  В чем прикол?

Все правильно. Выражение в скобке (float)((aprtLast - aprtFirst) / 100) считается по правилам арифметики целых чисел и равно целому числу 3. То, что вы после этого приводите его к float - на результат уже не влияет. Максимальное значение переменной i - 314. Вот и получается в итоге 314 / 3 = 104

Хотите, чтобы первая скобка считалась как вещественное число - перепишите выражение так:

lcd.print(i / (float)((aprtLast - aprtFirst) / 100.0));

 

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

b707 пишет:

перепишите выражение так:

lcd.print(i / (float)((aprtLast - aprtFirst) / 100.0));

вроде, достаточно:

lcd.print(100.0 / (aprtLast - aprtFirst));
b707
Онлайн
Зарегистрирован: 26.05.2017

Ворота пишет:

вроде, достаточно:

lcd.print(100.0 / (aprtLast - aprtFirst));

а переменная i где? :)

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ой, блин!

lcd.print(i *100.0 / (aprtLast - aprtFirst));

 

kostyamat
Offline
Зарегистрирован: 16.11.2017

Спасибо! С меня пиво. :)