Что это (ошибка в вычислениях)?

ustas
Offline
Зарегистрирован: 12.03.2012

Простенький скетч

unsigned int syncYear;
unsigned int syncMonth;
unsigned int syncDay;

float ParamValue=1306.08;

void setup(){
  Serial.begin(115200);
  syncYear=int(ParamValue/100);
  Serial.println(syncYear);
  syncMonth=int(ParamValue-syncYear*100);
  Serial.println(syncMonth);
  syncDay=int((ParamValue*100-syncYear*10000-syncMonth*100));
  Serial.println(syncDay);
}

void loop(){
}

На входе приходит float ParamValue с датой в формате YYMM.DD

Дальше эту дату разбираем на составляющие, но особенность в том, что syncDay - считается не всегда правильно. К примеру, исполнение этого кода дает:

13
6
7

Но на входе-то было 1306.08

Почему так? Как обойти?

toc
Offline
Зарегистрирован: 09.02.2013

float это часто не точно.  Добавьте в начало Serial.println(ParamValue);

разберитесь как работает int() и умножение float на int.

попробуйте в 13 строке умножить ParamValue на 101. 

ustas
Offline
Зарегистрирован: 12.03.2012

Выкрутился так:

syncDay=int((sensor.ParamValue-syncYear*100-syncMonth+0.002)*100);