@Vadimm1001

Вывод чисел с плавающей точкой на жк дисплей?

Имеется две функции, одна выводит на экран целое число, другая одно число после точки. Вторая функция не работает, то есть выводит просто ноль, но если во вторую функцию передать аргумент без целого числа то все работает без проблем.
void return_celoe(double data)
{
	double ostatok, celoe,data1;
	unsigned char otvet,mass[10],count=1, mass1;
	ostatok=modf(data, &celoe);
	otvet=celoe;
	data1=celoe;
	if(otvet==0)
	lcd_dat(0x30);
	while(otvet>0)
	{
	data1/=10.0;
	otvet=data1;
	ostatok=modf(data1, &celoe);
	mass1=ostatok*10.0+0x30;
	mass[count]=mass1;
	count++;
	}
	while(count>1)
	{
	lcd_dat(mass[--count]);	
	}
}
void return_ostatok(double data)
{
	
	double ostatok, celoe, data1=data;
	int otvet, sto;
	ostatok=modf(data1, &celoe);
	otvet=ostatok*10.0;
	lcd_dat(otvet+0x30);
}


int main(void)
{
	lcd_init();
	return_celoe(7990324.9); /*НА РАЗНИЦУ МЕЖДУ ЦЕЛЫМИ ЧИСЛАМИ НЕ ОБРАЩАЙТЕ ВНИМАНИЯ*/
	lcd_dat('.');
	return_ostatok(7999.9); /*ЗДЕСЬ ЕСЛИ НАПИСАТЬ НЕ 7990324.9 А 0.9 ТО ВСЕ РАБОТАЕТ, ТАКЖЕ ЕСЛИ ПЕРЕДАТЬ 7999.9 ТО НА ЭКРАН ВЫВОДИТСЯ 7999.8
							А ЕСЛИ 799.9 ТО ТАК ЖЕ 799.9 ПОЧЕМУ ТАК?																												 */
	
}

Как я думаю чем больше целое число тем больше остаток растягивается
  • Вопрос задан
  • 371 просмотр
Решения вопроса 1
Насколько я понимаю, проблема в том, что остаток выдается с плюс-минус единицей?
Это из-за проблем с точностью в числах с плавающей точкой: например, число 7.9 может храниться в памяти компьютера как 7.9000000..., а может как 7.8999999
Можно вместо простого присвоения округлить до ближайшего целого:
otvet=round(ostatok*10.0);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы