FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: FHEMAN am 24 Oktober 2021, 20:56:06

Titel: [gelöst] ReadingsNum rechnet anders als erwartet
Beitrag von: FHEMAN am 24 Oktober 2021, 20:56:06
Hi, ich konnte in Commandref und Wiki keine weiteren Details zu ReadingsNum finden. Ich habe festgestellt, dass ReadingsNum - ReadingsNum teils ein falsches Ergebnis liefert:
1. ReadingsNum("","", 11.2) - ReadingsNum("","", 11.1)
= 0.0999999999999996 //falsch
2. ReadingsNum("","", 1.2) - ReadingsNum("","", 1.1)
= 0.0999999999999996 //falsch
3- ReadingsNum("","", 0.2) - ReadingsNum("","", 0.1)
= 0.1 //richtig

Das Ganze natürlich auch mit echten Readings.

Könnt ihr mir sagen, ob das ein Bug ist oder ich etwas übersehe?
Als Workaround mit dem Round-Parameter zu arbeiten wäre suboptimal, zumal die Default-Werte hier nicht berücksichtigt werden (nach meinem Verständnis).

Einen schönen Abend
Ronny
Titel: Antw:ReadingsNum rechnet anders als erwartet
Beitrag von: Otto123 am 24 Oktober 2021, 21:04:16
Hallo Ronny,

versuch mal  ;){11.2 - 11.1}
Das hat nichts mit ReadingsNum zu tun, das ist die "ganz normale" Zahlendarstellung der digitalen Gleitkommaarithmetik. Wirst Du außer beim Taschenrecher sicher immer finden.
sprintf  (https://perldoc.perl.org/functions/sprintf)hilft Dir bei der finalen Darstellung nach Deinen Wünschen.
Beispiel:
{sprintf "%.2f", 11.2 - 11.1}


Gruß Otto
Titel: Antw:ReadingsNum rechnet anders als erwartet
Beitrag von: Christoph Morrison am 24 Oktober 2021, 21:53:14
Zitat von: Otto123 am 24 Oktober 2021, 21:04:16
sprintf  (https://perldoc.perl.org/functions/sprintf)hilft Dir bei der finalen Darstellung nach Deinen Wünschen.
Beispiel:
{sprintf "%.2f", 11.2 - 11.1}

Was identisch (https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/99_Utils.pm#L239) zum round-Parameter ist ;-)
Titel: Antw:ReadingsNum rechnet anders als erwartet
Beitrag von: Otto123 am 24 Oktober 2021, 22:14:59
Naja nicht wirklich wenn man die Aufgabe vom TE nimmt :)
{ReadingsNum("","", 1.2,1) - ReadingsNum("","", 1.1,1)}
Er wollte ja das Ergebnis von ReadingsNum() - ReadingsNum() "richtig". Oder ich habe den "Round - Parameter" nicht verstanden.
Titel: Antw:ReadingsNum rechnet anders als erwartet
Beitrag von: FHEMAN am 24 Oktober 2021, 22:57:23
Ich nutze Fhem natürlich nur als Taschenrechner  ;)

Zitat von: Otto123 am 24 Oktober 2021, 22:14:59
Naja nicht wirklich wenn man die Aufgabe vom TE nimmt :)
{ReadingsNum("","", 1.2,1) - ReadingsNum("","", 1.1,1)}
Er wollte ja das Ergebnis von ReadingsNum() - ReadingsNum() "richtig". Oder ich habe den "Round - Parameter" nicht verstanden.
Round wirkt sich nicht auf die angegebenen Default Values von ReadingsNum aus. Gänzlich sauber ist das nicht.
Titel: Antw:[gelöst] ReadingsNum rechnet anders als erwartet
Beitrag von: frober am 25 Oktober 2021, 10:41:10
Man kann auch das Fhem eigene round() benutzen, das ist analog sprintf, jedoch einfacher zu schreiben:

{round(ReadingsNum("","", 1.2) - ReadingsNum("","", 1.1),1)}