Округление float до десятых

Уважаемые, а как скрепно-правильно округлять значение переменных до десятых с шагом 0.2? С шагом 0.1 понятно:

  val = round(currentTemperature * 10.0) / 10.0;
  zSender.AddItem("zsTemp", val); 

а вот с 0.2 как?

  val = round(currentTemperature * 5.0) / 5.0;
  zSender.AddItem("zsTemp", val); 

выдаёт фигню, что моих знаний математики хватает, чтобы понять, что фигня.

Зачем: просто на графике zabbix при округлении до 0.1 получается много некрасивых “запилов”.

2: @sadman41, я в курсе, что “красивый график” и “достоверность данных” в одном предложении не употребляются. Там до этого ещё сглаживание, дай Бог, до сендера только название переменной останется актуальным.

и что тебя не устраивает, что 0.1 округляет в большую сторону? отними тогда перед округлением 0.01

val = round((currentTemperature - 0.01) * 5.0) / 5.0;

Для начала бы понять - что такое “округлить до 0.2”.
Судя по приведенному коду, вам нужно число, умноженное на 10 сделать четным.

Сбросьте у него младший бит.

(25.5 * 10) & B11111110

При 0.2 запилов будет меньше но круче. Вопрос кто рисует граффик? Если хочется плавный нужно интерполяций добавлять точек между полученными.

Это не округление - попробуйте на 25.51

Зато того, что Вы приводите в сообщении, не хватает, что сделать такой вывод.
Приведите образец вывода, который бы доказывал Ваше утверждение.

Полдиапазона добавить тогда придется. Вроде не запутался в вычислениях.

(int((13.49 + 0.2/2) * 10) & 0xFE) / 10 = ((int(13.49 * 10) + 2/2) & 0xFE) / 10 = (135 & 0xFE) / 10 = 13.4

(int((13.51 + 0.1) * 10) & 0xFE) / 10 = ((int(13.51 * 10)+ 1) & 0xFE) / 10 = (136 & 0xFE) / 10 = 13.6

А если

val = (round(currentTemperature * 5.0) / 10.0) * 2;
  zSender.AddItem("zsTemp", val);

Задача вроде бы простая. Округлять данные температуры / влажности с дискретностью 0.2 градуса / процента. Можно, конечно, округлять и до целых, но тогда вообще неинтересно. Нафига мне тогда “процессор в два ядра и памяти три ведра”.

График рисует Zabbix. Это система мониторинга.
Взрывных случаев повышения температуры-влажности не предвидится. Это учебные аудитории, там максимум перегар ловить надо (и то адресно).

так оно так и округляло, правда 0,1 округлит до 0.2, в исходных какую точность имеем?

Так что ли надо?

C=20.298 O=20.20
C=20.299 O=20.20
C=20.300 O=20.40

или так?

C=20.099 O=20.00
C=20.100 O=20.00
C=20.101 O=20.20

Вообще нет смысла в округлении до десятых/сотых, имхо. До целых вполне норм.

Опираемся в оценке на санпин, а там никаких десятых нет, вроде. Да и градусники дадут большую погрешность / болтание в воздушном объеме, чем градус. Скоко там аудитория…кубов 100, с дверями, окнами и вентиляцией.

Кто просил вывод? Их есть у меня:

[bme280] Temperature: … 29.04
[bme280] Pressure: … 726.53
[bme280] Humidity: … 15.74

Uptime: 0.00:30:00 / 1800

request = ZBXD�{“request”:“sender data”,“data”:[{“host”:“WMZS204”,“key”:“zsTemp”,“value”:“29.00”},{“host”:“WMZS204”,“key”:“zsHumi”,“value”:“15.70”},{“host”:“WMZS204”,“key”:“zsPres”,“value”:“726.50”}]}

изначально сырьё, далее то, что передаётся. Влажность 15.74, передаётся 15.7, хотя по логике (ладно, по моему хотению) должно быть 15.8

там и будет 15.8 если там не 15.8 смотри код, что-то там не так сделано, я то думал что тебе не нравится само округление в большую или меньшую сторону)

А как 15.7 какое число должно передаваться?

Тут все логично - 0,04 раундится в 0.00 и выходит 15.7+0.0
Был бы floor() - получилось 15.7+0.1

1 лайк

Да всё и началось с санпина. Готовим мехводов по заказу МО. И посещаемось занятий оставляет желать чего угодно. Методисты обзванивают “ленивцев” и их родителей. Одну такую родительницу вызвонили, она на нас СЭС натравила, видите ли, её личинка не может учиться в таких условиях. [б…ь] а какого [х…я] он в мехводы записался, да ещё и на топливозаправщик.

Ну и… zabbuino таки работает, СПАСИБО!, но мне нужен несколлько другой функционал.

@zopukh так вы код из #8 пробовали или нет?

Как вариант

float to_0_2(float q0)
{
 int temp = (int)((q0 * 10)/2) * 2;
return temp/ 10.0; 
}

Его конструкция работает, я так и не понял, что ему в ней не так, сдвинуть округление в ту или иную сторону?

Разберётся, не такое уж сложное дело…