Float печатается только 2 десятичных знака после запятой

Раньше была похожая тема, но она не решила мою проблему. У меня возникла проблема с отправкой данных GPS, которые являются плавающими, и я не мог получить плавающие данные с тем же количеством значащих цифр, что и отправлял. Я всегда получал число с 2 цифрами после запятой. Поэтому я начал отладку и написал этот простой код только для того, чтобы проверить, работают ли числа с плавающей запятой так, как задумано:

#include <SoftwareSerial.h>
void setup() {
Serial.begin(9600);
}
void loop() {
float number1;
number1=1.45436;
Serial.print(number1);
delay(200);
}

И серийный монитор показал 1,45 в качестве вывода. Как увеличить точность числа с плавающей запятой, которое я сохраняю в памяти?

, 👍9

Обсуждение

Он работает, я ищу adxl335, используя его в качестве измерителя вибрации и балансировщика. У кого-нибудь есть код для ardiuno r3, @nishant shrivastava


3 ответа


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

17

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

Вы можете прочитать об этом в официальной документации здесь

С помощью следующего кода вы можете использовать больше десятичных знаков (фрагмент из официальной документации):

-Serial.println(1.23456, 0) gives "1" 
-Serial.println(1.23456, 2) gives "1.23" 
-Serial.println(1.23456, 4) gives "1.2346" 

Также, вероятно, поможет следующая ссылка (PrintFloat):

PrintFloat

Примерно он работает, перебирая цифры и печатая их.

,

«Плавающие» числа Arduino *не* особенно точны. Они имеют 6-7 значащих цифр, считая те, что стоят по обе стороны от запятой. Для более высокой точности можно использовать «двойник»., @Chris Stratton

Также обратите внимание, что Arduino не очень хорош (т.е. быстр) с числами с плавающей запятой/удвоениями., @Michel Keijzers

@ChrisStratton Что касается комментария о более высокой точности: на Arduino двойное число - это просто еще одно название для float. См.: https://www.arduino.cc/reference/en/language/variables/data-types/float/ «В отличие от других платформ, где вы можете получить большую точность, используя двойное число (например, до 15 цифр), на в Arduino двойное значение имеет тот же размер, что и число с плавающей запятой»., @statueuphemism

Также String() будет делать то же самое. Он принимает второй аргумент, поэтому, если число является «плавающим» или «двойным»: «String (floatVariable, 3)» дает вам «1,234»., @Andrew


1

Умножьте число с плавающей запятой на 10000 (или любое другое число по вашему желанию), отправьте его как целое число и преобразуйте полученное целое число обратно в число с плавающей запятой.

В качестве альтернативы измените библиотеку или напишите свою собственную.

,

Вы имеете в виду изменить серийную библиотеку? Кроме того, это то, что я делаю (умножаю на что-то и т. д.). Проблема в том, что Arduino не сохраняет числа с той точностью, которую я им даю. Если то, что вы предложили, должно работать, сначала Arduino должен правильно отображать поплавок на последовательном мониторе. Я ошибаюсь?, @Anthropomorphous Dodecahedron


9

По умолчанию Serial.print() печатает числа с плавающей запятой с двумя десятичными цифрами. .

float num = 7.875;
Serial.println(num, 4);

выведет num с 4 десятичными цифрами, таким образом: 7,8750.

Точность float не уменьшается так, как вы думаете. Посмотрите этот ответ для лучшего объяснения.

,