FHEM Forum
FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet 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
-
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
-
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 ;-)
-
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.
-
Ich nutze Fhem natürlich nur als Taschenrechner ;)
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.
-
Man kann auch das Fhem eigene round() benutzen, das ist analog sprintf, jedoch einfacher zu schreiben:
{round(ReadingsNum("","", 1.2) - ReadingsNum("","", 1.1),1)}