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
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 ;-)
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 ;)
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.
Man kann auch das Fhem eigene round() benutzen, das ist analog sprintf, jedoch einfacher zu schreiben:
{round(ReadingsNum("","", 1.2) - ReadingsNum("","", 1.1),1)}