Установка значения float до двух знаков после запятой
Я пытаюсь установить свои измерения температуры на два знака после запятой. В настоящее время то, что я получаю, - это шесть знаков после запятой. Вот мой код:
#include "math.h"
...
(in loop)
temp1 = sensors.getTempCByIndex(0);
temp1 = roundf(temp1*100)/100;
Как только я нажимаю temp1 на базу данных реального времени Firebase, появляются десятичные знаки sic, такие как 26.059999. Я использую датчик dsb20 для измерения температуры. Что может быть не так?
Заранее спасибо за вашу помощь!
@Nina, 👍1
Обсуждение3 ответа
переменные с плавающей запятой не имеют числа знаков после запятой: именно так они и получили свое название: "плавающая точка" - десятичная точка плавает по мере необходимости.
Только когда вы выводите значение, оно отображается с фиксированным (или ограниченным) числом знаков после запятой. Используя Serial.print ()
, вторая цифра - это количество десятичных точек:
Serial.println(temp1, 6); // 26.059999
Serial.println(temp1, 2); // 26.06
Спасибо за ваш ответ @Majenko. Проблема в том, что мне нужно использовать это число для дальнейших вычислений, а также перенести его в базу данных Firebase в реальном времени. Следовательно, существует ли аналогичное решение без серийной печати?, @Nina
Используйте целое число, но работайте с значением, кратным вашему значению. Для двух знаков после запятой умножьте его на 100, запишите в целое число. Когда вы захотите распечатать его, снова разделите его на 100., @Majenko
Это мой код, но он все равно не работает: `
плавающий темп2 = датчики.getTempCByIndex(0);
int temp3 = круглый(темп2*100);
плавающая температура 1 = температура 1/100;
`., @Nina
В дополнение к ответу Майенко:
float
не может принимать никакого десятичного числа. Он имеет ограниченное изменение и ограниченное разрешение в этом диапазоне, можно сказать. Так что если часто случается, что плоское (округленное) значение не является допустимым float
. Это относится и к 26.05
. Нет никакого допустимого значения float, то есть ровно
26.05
. Таким образом, выбирается ближайшее допустимое значение float. Следующий код всегда будет печатать
26.059999
:
float i = 26.05;
Serial.println(i);
так как переменная i
содержит номер
float
26.059999 (ближайшее допустимое значение float к
26.06
). Именно по этой причине в основном округление float
s выполняется только непосредственно с выводом/печатью. На этом этапе число больше не привязано к ограничениям типа float
(так как оно внутренне больше не сохраняется в этом типе).
Спасибо за ваш ответ. Проблема в том, что мне нужно использовать это число для дальнейших вычислений, а также переместить его в базу данных Firebase в реальном времени. Следовательно, существует ли аналогичное решение без серийной печати?, @Nina
Как писал Мадженко, вы можете использовать тип данных "int". Но мне непонятно, почему вам действительно нужно сократить до 2 десятичных знаков в своей базе данных. Если вы производите дальнейшие вычисления с этими данными, лишние цифры не повредят. Или вы тогда просто отображаете эти данные из базы данных? Тогда лучшим способом было бы округление в этой программе отображения. Или вы можете отправить данные в firebase в виде строки. Затем вы можете сделать то же округление, что и с Serial.print()
при построении строки. Хотя я не вижу в этом смысла., @chrisl
можно преобразовать в n десятичных знаков с помощью класса String
float num = 3.14159
String str1 = String(num, 1) // 3.1
String str2 = String(num, 2) // 3.14
String str3 = String(num, 3) // 3.141
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Программаторы для этой платы отсутствуют - Программирование ESP32 Cam с помощью Ardunio IDE
- ESP32-CAM первый: 0x8 TG1WDT_SYS_RESET загрузочный цикл
- esp32 Stack canary watchpoint срабатывает
- Проверка размера во флэш-памяти Esp32
- Ошибка Cast from 'char*' to 'uint8_t {aka unsigned char}' loses precision [-fpermissive]
- WindowsError(31, "Устройство, подключенное к системе, не функционирует") в arduino
- Как очистить кучу памяти в esp32
Является ли " temp1
плавающим
или
двойным`? Как вы передаете это на базу огня?, @Edgar Bonet@EdgarBonet temp1 определяется как float. Вот как я продвигаю его в Firebase (используя библиотеку esp32Firebase:
arr.set("/[0]", temp1)); arr.набор("/[1]", tms); Firebase.push(firebaseData2, "Устройства/602", arr)
, @NinaВы пробовали использовать " двойную`?, @Edgar Bonet