Установка значения float до двух знаков после запятой

Я пытаюсь установить свои измерения температуры на два знака после запятой. В настоящее время то, что я получаю, - это шесть знаков после запятой. Вот мой код:

#include "math.h"

...

(in loop)
temp1 = sensors.getTempCByIndex(0);
     temp1 = roundf(temp1*100)/100;

Как только я нажимаю temp1 на базу данных реального времени Firebase, появляются десятичные знаки sic, такие как 26.059999. Я использую датчик dsb20 для измерения температуры. Что может быть не так?

Заранее спасибо за вашу помощь!

, 👍1

Обсуждение

Является ли " temp1 плавающим или двойным`? Как вы передаете это на базу огня?, @Edgar Bonet

@EdgarBonet temp1 определяется как float. Вот как я продвигаю его в Firebase (используя библиотеку esp32Firebase: arr.set("/[0]", temp1)); arr.набор("/[1]", tms); Firebase.push(firebaseData2, "Устройства/602", arr), @Nina

Вы пробовали использовать " двойную`?, @Edgar Bonet


3 ответа


1

переменные с плавающей запятой не имеют числа знаков после запятой: именно так они и получили свое название: "плавающая точка" - десятичная точка плавает по мере необходимости.

Только когда вы выводите значение, оно отображается с фиксированным (или ограниченным) числом знаков после запятой. Используя 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


2

В дополнение к ответу Майенко:

float не может принимать никакого десятичного числа. Он имеет ограниченное изменение и ограниченное разрешение в этом диапазоне, можно сказать. Так что если часто случается, что плоское (округленное) значение не является допустимым float. Это относится и к 26.05. Нет никакого допустимого значения float, то есть ровно 26.05. Таким образом, выбирается ближайшее допустимое значение float. Следующий код всегда будет печатать 26.059999:

float i = 26.05;
Serial.println(i);

так как переменная i содержит номер float 26.059999 (ближайшее допустимое значение float к 26.06). Именно по этой причине в основном округление floats выполняется только непосредственно с выводом/печатью. На этом этапе число больше не привязано к ограничениям типа float (так как оно внутренне больше не сохраняется в этом типе).

,

Спасибо за ваш ответ. Проблема в том, что мне нужно использовать это число для дальнейших вычислений, а также переместить его в базу данных Firebase в реальном времени. Следовательно, существует ли аналогичное решение без серийной печати?, @Nina

Как писал Мадженко, вы можете использовать тип данных "int". Но мне непонятно, почему вам действительно нужно сократить до 2 десятичных знаков в своей базе данных. Если вы производите дальнейшие вычисления с этими данными, лишние цифры не повредят. Или вы тогда просто отображаете эти данные из базы данных? Тогда лучшим способом было бы округление в этой программе отображения. Или вы можете отправить данные в firebase в виде строки. Затем вы можете сделать то же округление, что и с Serial.print() при построении строки. Хотя я не вижу в этом смысла., @chrisl


1

можно преобразовать в 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
,