Присвоение форматированного значения переменной

Посмотрите на этот фрагмент кода (из библиотеки TinyGPS++):

Serial.print(gps.location.lat(), 6);

Он печатает широту с точностью до 6 десятичных знаков. Я хочу, чтобы вместо того, чтобы печатать это значение, присвоить его переменной.

Но я хочу, чтобы оно было назначено так же, как указано выше, с шестью десятичными знаками. Есть ли способ сделать это?

, 👍0

Обсуждение

Похоже, вам нужен dtostrf() - http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42 Он должен делать то, что вы хотите (однако вам придется предварительно выделить строку)., @Connor Wolf

Чтобы внести ясность: хотите ли вы сохранить строку с 6 знаками после запятой или значение с плавающей запятой, округленное до 6 знаков после запятой?, @BrettAM

Как бы то ни было, но, думаю, веревка мне больше подойдет, @user1584421

Какие исследования вы провели по этому поводу? @ConnorWolf дал вам комментарий с обоснованным предложением, вы его рассмотрели?, @Madivad


2 ответа


Лучший ответ:

0

Просто расширяя то, что сказал КоннорВульф (которое я видел вчера), посмотрите на ссылку, которую он вам дал, она дает вам представление о команде, которая вам нужна.

Функция dtostrf() возвращает указатель на преобразованную строку s.

char* dtostrf ( двойной __val, подписанный символ __width, беззнаковый символ __prec, символ * __s )
Функция dtostrf() преобразует значение double, переданное в val, в представление ASCII, которое будет сохранено в папке s. Вызывающая сторона несет ответственность за предоставление достаточного объема памяти в s.

Конвертация осуществляется в формат «[-]д.ддд». Минимальная ширина поля выходной строки (включая «.» и возможный знак для отрицательных значений) задается в виде ширины, а prec определяет количество цифр после десятичного знака. ширина – это значение со знаком, отрицательное для регулировки по левому краю.

Исходя из этого, я написал короткий набросок, который делит millis() на 1000 и сохраняет это значение в виде числа с плавающей запятой. Затем мы используем это число с плавающей запятой в качестве источника для dtostrf(), чтобы выполнить свою работу и сохранить результат в массиве символов.

void setup(){
  Serial.begin(9600);
}

void loop(){
  char c[12];
  float f = millis()/1000.0;
  dtostrf(f,11,3,c);
  Serial.println(c);
  delay(111);
}

Я выбрал произвольные значения, вам придется выполнить вычисления по размеру создаваемого массива (не забудьте ведущий отрицательный знак, цифры перед десятичной запятой, десятичную дробь и цифры точности а также нулевой терминатор!

,

-1

У меня была такая же проблема, и я нашел ответ

char latitude[20];
char longitude[20];

dtostrf(gps.location.lat(),8,6,latitude);
dtostrf(gps.location.lng(),8,6,longitude);
,