То, что вы видите, является приближением компилятора ваших значений с плавающей точкой, потому что их значения превышают точность, возможную с помощью числа с плавающей точкой (4 байта). Использование двойного не поможет, если ваш MCU не поддерживает 8-байтовые двойные числа; Я не использовал тинси, но я сильно сомневаюсь, что он поддерживает 8-байтовые двойники.
Это не умное решение, но оно должно направить вас в правильном направлении.
Определить структуру, которая может представлять большие значения действительного числа
typedef struct {
int whole;
unsigned long fraction;
} BigNumber;
Вы можете объявить / инициализировать широту и долготу l
BigNumber latitude { 126, 9653503 };
BigNumber longitude { 37, 4980608 };
Тогда печатать легко:
sprintf(strbuf, "%i.%lu %i.%lu",
latitude.whole, latitude.fraction,
longitude.whole, longitude.fraction
);
Однако , если необходимы математические операции - сложение, вычитание и т. Д. - это не обрезает; найти произвольную библиотеку больших чисел, такую как Ника Гаммона
Наконец, будьте осторожны: в вашем коде str1 слишком маленький - нет никакого учета нулевого терминатора, добавляемого sprintf, так что вам просто повезло, что ваша программа не дает сбоя.