Begrense antall desimaler i en variabel

Er det en mulighet for å endre antall desimaler i en Float verdi, som kommer fra en rapport fra ett utstyr?

Har f.eks Netatmo som rapporterer med veldig mange desimaler. Skulle gjerne begrenset dette til maksimalt 1 desimal, før jeg sender verdien videre til en variabel.

Ingen med innspill?
Mer konkret, så henter jeg temperaturmåling fra en Netatmo utendørs modul og daglig push på utetemperaturen, ved å sette en variabel. Men det er vel rundt 10 siffer etter desimalen, så skulle gjerne begrenset variabelen til kun å inneholde 1 siffer etter desimal.

Ja det er mulig. Det finnes ingen ferdiglaget funksjon for dette, men du kan lage funksjonen selv.

Her er noen forslag:

Det aller enkleste ville vært å bare fjerne desimalene ved å bruke Transform med expression: (input - (input % 1)). Da får du tallet uten desimaler, men dette er ikke rundet opp eller ned.

Hvis du ønsker å runde tallet opp eller ned ved hjelp av desimalene så kan du f.eks. lagre desimalene i en egen variabel ved bruk av en ny Transform med expression: (input % 1) eller (original_temperatur_variabel % 1).
Da kan du gjøre IF-sjekk på denne nye desimal-variabelen (f.eks. IF desimal_variabel > 0.5) og så gå videre inn i nye Transform noder som enten øker eller beholder gamle temperatur tallet, f.eks. transform expression: (temperatur_uten_desimaler + 1).

Hvis du absolutt må ha med desimaler så kan du i teorien ha 10 forskjellige IF-noder for alle 10 desimalene som gjør avrundingen for hver enkelt desimal, eksempel: IF (desimaler_variabel > 0.0 AND < 0.2) som ender i en Transform som legger til den ønskede desimalen: (temperatur_uten_desimaler + 0.1)

 
Mulig du kunne gjort dette med golang koding via Run script-noden, men der har jeg null peiling. Jeg er forsåvidt ekstremt dårlig i matte, så det er mulig du kan finne en mye bedre måte å løse dette på ved hjelp av noen enklere matematiske triks. :slight_smile:

1 Like

Hva med å gange input med 10 først? Da får du eks. 64.0000… Så tar du % 1 på det. Du får 64. Deler på 10 og du har 6.4.

( (input * 10) - ( (input * 10) % 1 ) ) / 10
Eksempel med tallet 6.87654321:
( (6.87654321 * 10) - ( (6.87654321*10) % 1 ) ) / 10 =
(68.7654321 - ( 68.7654321 % 1 ) ) / 10 =
(68.7654321 - 0.7654321) / 10 =
68 / 10 =
6.8

Ikke testet…
Ved avrunding skulle det blitt 6.9, men en feilmargin på 0.1 er kanskje å leve med i dette tilfellet.
Du kan bytte ut 10 med 100 og får da 2 desimaler. (6.87).

% betyr forøvrig å hente ut resten av et delestykke. Eks. 11%2 er 0.5 for deler du 11:2 = 5.5 og da har du 5 hele og resten er 0.5.

1 Like

Takk for innspill begge to. Regnestykket til @alfgeorg var den raskeste veien til løsningen, med litt justeringer. Takk skal dere ha :slight_smile:

Takk for denne løsningen. Som matematisk idiot prøvde jeg å Google meg til måter å runde desimaler med bruk av aritmetikk, men fant ingenting som i det hele tatt kunne nærme seg denne metoden.

Har noen flows som jeg må oppdatere nå :+1: