Brett vorm Kopf. Finde den Fehler nicht. – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 11:46:00 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772746#m1772746 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772746#m1772746 <p>Hallo,</p> <p>wer nimmt mal gerade mein Brett vor dem Kopf weg? Warum ergibt die if-Bedingung <code>true</code>?</p> <pre><code class="block language-php"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c. <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>ergibt:</p> <pre><code class="block">a+b ist größer als c a: 42.01 b: 146.18 c: 188.19 </code></pre> <p>Ich habs auch mal versucht, die 3 Werte nochmal über <code>settype</code> explizit auf Floatwerte zu casten, aber das ändert nichts.</p> <p>Joachim</p> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 12:00:57 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772750#m1772750 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772750#m1772750 <p>Auch Hallo,</p> <blockquote> <p>wer nimmt mal gerade mein Brett vor dem Kopf weg? Warum ergibt die if-Bedingung <code>true</code>?</p> <pre><code class="block language-php"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c. <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>ergibt:</p> <pre><code class="block">a+b ist größer als c a: 42.01 b: 146.18 c: 188.19 </code></pre> <p>Ich habs auch mal versucht, die 3 Werte nochmal über <code>settype</code> explizit auf Floatwerte zu casten, aber das ändert nichts.</p> </blockquote> <p>Vielleicht findet sich die Lösung <a href="https://www.php.net/manual/de/language.operators.precedence.php" rel="nofollow noopener noreferrer">in der Operatorrangfolge</a>?</p> <p>Manchmal helfen auch ein paar Klammern.</p> <p>Stay TRUE<br> der Operator</p> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 12:01:02 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772751#m1772751 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772751#m1772751 <p>Also bei mir mit php7.3 ergibt der Code keine Ausgabe.</p> <p>Was sagt var_dump zu den 3 Variablen? Welche php-Version hast du?</p> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 12:07:37 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772753#m1772753 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772753#m1772753 <p>Hi,</p> <blockquote> <p>wer nimmt mal gerade mein Brett vor dem Kopf weg?<br> Warum ergibt die if-Bedingung <code>true</code>?</p> <pre><code class="block language-php"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c. <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>ergibt:</p> <pre><code class="block">a+b ist größer als c a: 42.01 b: 146.18 c: 188.19 </code></pre> </blockquote> <p>naja, ist ja auch <strong>fast</strong> korrekt.<br> Ich tippe mal auf einen Klassiker: Rundungsfehler bei der Addition von float-Werten.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 14:41:40 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772768#m1772768 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772768#m1772768 <p>Hallo Joachim,</p> <p>man kann das Problem noch einfacher darstellen. <=> ist der Spaceship Operator, der -1, 0 oder 1 ausgibt, je nachdem, ob der linke Operand kleiner als, gleich wie oder größer als der rechte Operand ist.</p> <pre><code class="block language-php"><span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token number">42.01</span> <span class="token operator">+</span> <span class="token number">146.17</span> <span class="token operator"><=></span> <span class="token number">188.18</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"<br>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token number">42.01</span> <span class="token operator">+</span> <span class="token number">146.18</span> <span class="token operator"><=></span> <span class="token number">188.19</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"<br>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token number">42.02</span> <span class="token operator">+</span> <span class="token number">146.18</span> <span class="token operator"><=></span> <span class="token number">188.20</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"<br>"</span><span class="token punctuation">;</span> </code></pre> <p>Ergibt</p> <pre><code class="block">-1 0 1 </code></pre> <p>Grund: Der Datentyp float kann Integerzahlen im Bereich der Mantissenlänge jederzeit korrekt darstellen. Sobald Nachkommazahlen ins Spiel kommen, wird es schwierig, weil [IEEE 754] ein binäres Format ist. Du kannst bspw. 1/7 nicht als endliche Dezimalzahl darstellen. Und Du kannst 1/100 nicht als endliche Binärzahl darstellen.</p> <p>Dass der mittlere Vergleich 0 ergibt, ist reiner Zufall.</p> <p><a href="https://wiki.selfhtml.org/wiki/Programmiertechnik/Rechnerarithmetik" rel="nofollow noopener noreferrer">Janosch war dazu im Wiki sehr fleißig</a></p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 13:24:32 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772761#m1772761 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772761#m1772761 <p>Tach!</p> <blockquote> <p>Vielleicht findet sich die Lösung <a href="https://www.php.net/manual/de/language.operators.precedence.php" rel="nofollow noopener noreferrer">in der Operatorrangfolge</a>?</p> </blockquote> <p>Nein, <code>+</code> hat eine höhere Priorität als <code>></code>, also ist das genau das gewünschte.</p> <blockquote> <p>Manchmal helfen auch ein paar Klammern.</p> </blockquote> <p>In dem Fall nicht.</p> <p>dedlfix.</p> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 06:10:23 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772795#m1772795 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772795#m1772795 <p>Hallo,</p> <p>könnte man nicht mit Hilfe von <a href="https://www.php.net/manual/en/function.decbin" rel="nofollow noopener noreferrer"><code>decbin()</code></a> nachgucken, was PHP da im Hintergrund macht?</p> <p>bis später<br> Graf Bit</p> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 12:25:15 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772756#m1772756 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772756#m1772756 <p>Hi Martin,</p> <blockquote> <p>naja, ist ja auch <strong>fast</strong> korrekt.<br> Ich tippe mal auf einen Klassiker: Rundungsfehler bei der Addition von float-Werten.</p> </blockquote> <p>Hätte ich auch vermutet. Aber lass mal diesen Code laufen:</p> <pre><code class="block language-php"><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token number">42.02</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token number">146.18</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token number">188.20</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<br>equal"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<br>equal"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Er ergibt:</p> <pre><code class="block">a+b ist größer als c a: 42.02 b: 146.18 c: 188.20 equal </code></pre> <p>Ist schon irre. </p> <p>Joachim</p> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 13:02:07 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772757#m1772757 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772757#m1772757 <p>Hallo Joachim,</p> <blockquote> <pre><code class="block language-php"><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token number">42.02</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token number">146.18</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token number">188.20</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<br>equal"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"a+b ist größer als c <br>a: "</span><span class="token operator">.</span><span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>b: "</span><span class="token operator">.</span><span class="token variable">$b</span><span class="token operator">.</span><span class="token string double-quoted-string">" <br>c: "</span><span class="token operator">.</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<br>equal"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Er ergibt:</p> <pre><code class="block">a+b ist größer als c a: 42.02 b: 146.18 c: 188.20 equal </code></pre> </blockquote> <p>da wird sowohl der if- als auch der else-Zweig bearbeitet??<br> Das <em>kann</em> völlig unabhängig von der Bedingung eigentlich nicht sein; da muss noch ein anderer Fehler drinstecken. Irgendein überzähliges Semikolon oder falsch gesetzte Klammern - etwas in der Art.</p> <p>Gemein wäre etwa sowas:</p> <pre><code class="block language-php"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"false ist doch true!"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Beachte das Semikolon hinter der if-Klammer: Es schließt die if-Anweisung ohne Anweisungsblock ab, der nachfolgende Block in geschweiften Klammern gehört dann nicht mehr zur if-Anweisung. Solche Fehler sind schwer zu finden, weil sie eben keine Syntaxfehler sind.</p> <blockquote> <p>Ist schon irre. </p> </blockquote> <p>Vielleicht ist die Erklärung ganz simpel.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 08:46:52 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772800#m1772800 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772800#m1772800 <p>Ganz so irre ist das nicht. Es ist doch der selbe Fall wie im ersten Beispiel.</p> <p>Interessehalber habe ich nach "online float representation" gesucht und neben ein paar anderen Ergebnissen das hier gefunden <a href="http://weitz.de/ieee/" rel="nofollow noopener noreferrer">http://weitz.de/ieee/</a></p> <p>Damit kannst du sehen wie deine Zahlen binär dargestellt werden und kannst sie addieren.</p> <p>Dabei kommt heraus dass die Summe deiner Zahlen 188.20000000000002 ist.<br> Die einzelne Zahl 188.2 lässt sich dagegen ohne Rundungsfehler darstellen, also ist die Summe tatsächlich größer als 188.2.</p> <p>Das hier war mein erster Fund <a href="https://www.h-schmidt.net/FloatConverter/IEEE754de.html" rel="nofollow noopener noreferrer">https://www.h-schmidt.net/FloatConverter/IEEE754de.html</a>.<br> Auch nett, aber nur in 32 Bit Darstellung und ohne Rechenmöglichkeit.</p> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 13:08:16 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772758#m1772758 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772758#m1772758 <p>Hallo Martin,</p> <blockquote> <p>da wird sowohl der if- als auch der else-Zweig bearbeitet??<br> Das <em>kann</em> völlig unabhängig von der Bedingung eigentlich nicht sein;</p> </blockquote> <p>Es sind 2 if-else-Blöcke </p> <p>Daher weht der Wind.</p> <p>Was mich wundert, ist aber, dass ich dachte, wenn php Strings zum addieren vorfindet, dass es selber castet. Wenn möglich in INT oder wenn mit nachkomma, dann in Float.</p> <p>Das passiert auch, aber das Ergebnis stimmt trotzdem nicht.</p> <p>Joachim</p> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 13:36:27 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772763#m1772763 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772763#m1772763 <blockquote> <p>Gemein wäre etwa sowas:</p> <pre><code class="block language-php"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"false ist doch true!"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> </blockquote> <p>Oder sowas:</p> <pre><code class="block language-php"><span class="token variable">$var</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"false"</span><span class="token punctuation">;</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$var</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'bool'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$var</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span> </code></pre> Brett vorm Kopf. Finde den Fehler nicht. Oder verstehe settype nicht. :-/ Tue, 30 Jun 20 13:19:51 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772759#m1772759 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772759#m1772759 <p>Wer kann mir erklären, was hier php genau macht? Wie kommt es zu dieser Ausgabe?</p> <pre><code class="block language-php"><span class="token comment">// Werte</span> <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token number">42.02</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token number">146.18</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token number">188.20</span><span class="token punctuation">;</span> <span class="token comment">// Addition von Strings</span> <span class="token variable">$d1</span> <span class="token operator">=</span> <span class="token variable">$a</span><span class="token operator">+</span><span class="token variable">$b</span><span class="token punctuation">;</span> <span class="token comment">// Vergleich der Werte</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"1. Durchlauf: <br>Not equal<br>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$d1</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"(Variable d)<br>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"(Variable c)"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 2. Durchlauf mit gecasteten Werten</span> <span class="token comment">//------------------------------------------</span> <span class="token comment">// Cast in Float</span> <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Adition von Float-Werten</span> <span class="token variable">$d2</span> <span class="token operator">=</span> <span class="token variable">$a</span><span class="token operator">+</span><span class="token variable">$b</span><span class="token punctuation">;</span> <span class="token comment">// Vergleich der Werte</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token operator">+</span> <span class="token variable">$b</span> <span class="token operator">></span> <span class="token variable">$c</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// nix</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"<br>-----------------------------<br>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"2. Durchlauf: <br>equal<br>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$d2</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"(Variable d)<br>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"(Variable c)"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Ausgabe:</p> <pre><code class="block">1. Durchlauf: Not equal float(188.2) (Variable d) float(188.2) (Variable c) ----------------------------- 2. Durchlauf: equal int(2) (Variable d) bool(true) (Variable c) </code></pre> Brett vorm Kopf. Finde den Fehler nicht. Oder verstehe settype nicht. :-/ Tue, 30 Jun 20 13:22:16 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772760#m1772760 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772760#m1772760 <p>Tach!</p> <blockquote> <pre><code class="block language-php"><span class="token comment">// Cast in Float</span> <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'float'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Zitat Handbuch: "Returns TRUE on success or FALSE on failure."</p> <p>Du castest erst den Typ zu float und überschreibst durch die Zuweisung die Variablen mit true.</p> <p>dedlfix.</p> Brett vorm Kopf. Finde den Fehler nicht. Oder verstehe settype nicht. :-/ Tue, 30 Jun 20 13:31:07 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772762#m1772762 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772762#m1772762 <p>Hallo dedlfix,</p> <blockquote> <p>Du castest erst den Typ zu float und überschreibst durch die Zuweisung die Variablen mit true.</p> </blockquote> <p>Einverstanden. Hatte mir doch gedacht, dass ich bei <code>settype</code> Nachhilfe brauche </p> <p>Trotzdem erklärt es noch nicht, warum php den cast nicht selbstständig hin bekommt, denn php versucht es ja offensichtlich:</p> <pre><code class="block">1. Durchlauf: Not equal float(188.2) (Variable d) float(188.2) (Variable c) </code></pre> <p>Hast Du auch hierfür eine Lösung?</p> <p>Joachim</p> Brett vorm Kopf. Finde den Fehler nicht. Oder verstehe settype nicht. :-/ Tue, 30 Jun 20 14:48:36 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772769#m1772769 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772769#m1772769 <p>Hallo Joachim,</p> <p>PHP muss gar nicht casten.</p> <pre><code class="block language-php"><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token number">42.01</span><span class="token punctuation">;</span> </code></pre> <p>erzeugt bereits eine float-Variable, so dass settype($a, "float") wirkungslos ist.</p> <p>Zur Fehlerursache siehe meinen anderen Post.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 13:58:12 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772766#m1772766 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772766#m1772766 <p>Hallo,</p> <blockquote> <pre><code class="block language-php"><span class="token variable">$var</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"false"</span><span class="token punctuation">;</span> <span class="token function">settype</span><span class="token punctuation">(</span><span class="token variable">$var</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'bool'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$var</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span> </code></pre> </blockquote> <p>das ist in der Tat "tricky", aber nachvollziehbar: Ein String muss leer sein oder einen Null-Wert repräsentieren, um als boolsches <em>false</em> zu gelten.</p> <p>Ähnliche Fehler im Ansatz sieht man übrigens oft bei PHP-Laien, die den Unterschied zwischen Zahlenwerten und Strings noch nicht verstanden haben. Die notieren dann gern auch numerische Werte in Anführungszeichen, also als Strings. Meistens klappt das wegen der automatischen Typumwandlung, aber manchmal fällt man damit eben auf die Klappe.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 14:15:29 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772767#m1772767 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772767#m1772767 <blockquote> <p>Ähnliche Fehler im Ansatz sieht man übrigens oft bei PHP-Laien, die den Unterschied zwischen Zahlenwerten und Strings noch nicht verstanden haben. Die notieren dann gern auch numerische Werte in Anführungszeichen, also als Strings. Meistens klappt das wegen der automatischen Typumwandlung, aber manchmal fällt man damit eben auf die Klappe.</p> </blockquote> <p>Oder ein Integerüberlauf z.b in java wird auch immer wieder gerne genommen </p> <p>Oder auch sowas:</p> <pre><code class="block"> char b = 65; char c = 'A' + 1; java.lang.System.out.println( b ); // A java.lang.System.out.println( c ); // B </code></pre> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 15:25:04 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772775#m1772775 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772775#m1772775 <p>Hallo Rolf,</p> <blockquote> <p><a href="https://wiki.selfhtml.org/wiki/Programmiertechnik/Rechnerarithmetik" rel="nofollow noopener noreferrer">Janosch war dazu im Wiki sehr fleißig</a></p> </blockquote> <p>genau den Beitrag wollte ich heute schon verlinken, habe aber nach etwa 10min erfolgloser Suche aufgegeben.</p> <p>Fazit: Der Beitrag ist gut, aber nicht prominent verlinkt, und die Wiki-Suche reißt's in dem Fall auch nicht raus.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 18:59:51 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772786#m1772786 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772786#m1772786 <p>Hallo Rolf,</p> <blockquote> <p>Grund: Der Datentyp float kann Integerzahlen im Bereich der Mantissenlänge jederzeit korrekt darstellen. Sobald Nachkommazahlen ins Spiel kommen, wird es schwierig, weil [IEEE 754] ein binäres Format ist. Du kannst bspw. 1/7 nicht als endliche Dezimalzahl darstellen. Und Du kannst 1/100 nicht als endliche Binärzahl darstellen.</p> <p>Dass der mittlere Vergleich 0 ergibt, ist reiner Zufall.</p> </blockquote> <p>Irre Aber verständlich, wenn mans weiß. Danke für die Aufklärung. Trotzdem bleibt für mich die Frage, wie ich einen <=> Vergleich denn dann zweifelsfrei anstellen soll. Wirklich sehr interessantes Thema, auf das ich da gestoßen bin. Wie händelt man das? Über eine Art "Fuzzy-Logic"? Oder gibt es einen anderen "Trick"?</p> <p>Joachim</p> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 15:35:11 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772777#m1772777 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772777#m1772777 <p>Hallo Martin,</p> <p>suche nach IEEE oder Fließkomma.</p> <p><a href="https://wiki.selfhtml.org/index.php?search=flie%C3%9Fkomma&title=Spezial%3ASuche&go=Seite" rel="nofollow noopener noreferrer">https://wiki.selfhtml.org/index.php?search=fließkomma&title=Spezial%3ASuche&go=Seite</a></p> <p>Im Programmiertechnik-Portal ist sie auch verlinkt, aber das muss man wissen. Ich habe mal in den PHP Tutorials einen Link hinzugefügt. Jetzt muss nur noch jemand die PHP Startseite verlinken :D</p> <p>Ob man auch über's Glossar sinnvoll was machen kann?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 15:45:59 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772778#m1772778 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772778#m1772778 <p>Hallo Der Martin,</p> <p>wenn du deine Suchbegriffe mitteilst, könnte man entsprechende Weiterleitungen einrichten.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 16:04:20 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772780#m1772780 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772780#m1772780 <p>Hallo Rolf,</p> <blockquote> <p>suche nach IEEE oder Fließkomma.</p> <p><a href="https://wiki.selfhtml.org/index.php?search=flie%C3%9Fkomma&title=Spezial%3ASuche&go=Seite" rel="nofollow noopener noreferrer">https://wiki.selfhtml.org/index.php?search=fließkomma&title=Spezial%3ASuche&go=Seite</a></p> </blockquote> <p>ich hatte als erste spontane Eingebung nach <strong>float</strong> gesucht und den Datentyp gemeint, der einzige Suchtreffer führte aber zur CSS-Eigenschaft <strong>float</strong>. Dann nach <strong>Rundungsfehler</strong>, brachte aber auch nichts Sinnvolles. Ich weiß nicht mehr, welche Suchbegriffe ich sonst noch probiert habe.</p> <blockquote> <p>Im Programmiertechnik-Portal ist sie auch verlinkt, aber das muss man wissen.</p> </blockquote> <p>Ja, ergibt Sinn. Jedenfalls nicht spezifisch PHP oder Javascript; das Problem kann einen in sehr vielen Programmiersprachen treffen. Und nicht nur da, sogar in Excel.</p> <blockquote> <p>Ob man auch über's Glossar sinnvoll was machen kann?</p> </blockquote> <p>Bestimmt. </p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 17:35:01 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772783#m1772783 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772783#m1772783 <p>Hallo Rolf B,</p> <blockquote> <p>Ob man auch über's Glossar sinnvoll was machen kann?</p> </blockquote> <p><a href="https://wiki.selfhtml.org/wiki/Runden" rel="nofollow noopener noreferrer">https://wiki.selfhtml.org/wiki/Runden</a></p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 16:18:59 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772781#m1772781 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772781#m1772781 <p>Hallo Matthias,</p> <p>done.</p> <p>CSS/float: Links auf PHP/float und JavaScript/Number eingefügt</p> <p>Bei PHP/float und Number Links zur Rechnerarithmetik eingefügt.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 17:17:46 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772782#m1772782 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772782#m1772782 <p>Hallo Der Martin,</p> <blockquote> <blockquote> <p><a href="https://wiki.selfhtml.org/index.php?search=flie%C3%9Fkomma&title=Spezial%3ASuche&go=Seite" rel="nofollow noopener noreferrer">https://wiki.selfhtml.org/index.php?search=fließkomma&title=Spezial%3ASuche&go=Seite</a></p> </blockquote> <p>ich hatte als erste spontane Eingebung nach <strong>float</strong> gesucht und den Datentyp gemeint, der einzige Suchtreffer führte aber zur CSS-Eigenschaft <strong>float</strong>. Dann nach <strong>Rundungsfehler</strong>, brachte aber auch nichts Sinnvolles. Ich weiß nicht mehr, welche Suchbegriffe ich sonst noch probiert habe.</p> </blockquote> <p>auf der float-Seite gibt es nun dank <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a> einen prominenten Link auf die Seite Programmiertechnik/Rechnerarithmetik, die Seite Rundungsfehler leitet seit 2018 ebenfalls auf diese Seite. Zusätzlich habe ich noch eine Weiterleitung von Rechnerarithmetik auf die entsprechende Seite erstellt.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 19:07:43 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772787#m1772787 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772787#m1772787 <p>Immerhin ergibt auch</p> <pre><code class="block">echo (round(42.01,2) + round(146.17,2) <=> round(188.18,2)) </code></pre> <pre><code class="block">-1 </code></pre> <p> </p> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 19:15:35 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772788#m1772788 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772788#m1772788 <p>Hallo Joachim,</p> <blockquote> <p>Trotzdem bleibt für mich die Frage, wie ich einen <=> Vergleich denn dann zweifelsfrei anstellen soll.</p> </blockquote> <p>ein Vergleich auf größer oder kleiner ist normalerweise unkritisch - außer wenn man weiß, dass der zu vergleichende Wert <em>sehr</em> dicht am Limit liegen kann und diese geringen Unterschiede wirklich relevant sind.</p> <p>Die übliche Strategie ist dann: Man legt eine maximal akzeptable Fehlerschwelle $error fest (z.B. $error=1E-6) und prüft dann nicht auf Gleichheit, sondern auf Einhaltung eines Toleranzbandes.</p> <pre><code class="block language-php.bad">// falsch: if ($a==$b) </code></pre> <pre><code class="block language-php"><span class="token comment">//besser:</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token operator">-</span><span class="token variable">$b</span><span class="token punctuation">)</span><span class="token operator"><</span><span class="token variable">$error</span><span class="token punctuation">)</span> </code></pre> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 19:35:52 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772790#m1772790 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772790#m1772790 <p>Hallo Joachim,</p> <p>ok, darauf geht Janoschs Artikel nicht ein. Runden hilft Dir nicht. Wenn Du 42.01 auf 2 Nachkommastellen rundest, ist es immer noch eine Fließkommazahl die nicht genau dargestellt werden kann.</p> <p>Was Du tun musst, hängt von deiner Problemstellung ab. Wenn Du immer genau 2 Nachkommastellen hast, z.B. weil es Geld ist, dann rechne nicht mit Euro, sondern mit Cent. D.h. wenn Du "42.01" hereinbekommst, multipliziere es mit 100, addiere 0,5 und mache mit intval() eine Integerzahl draus.</p> <p>Könnte man in einer Funktion kapseln:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">toCents</span><span class="token punctuation">(</span><span class="token variable">$euro</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">intval</span><span class="token punctuation">(</span><span class="token variable">$euro</span> <span class="token operator">*</span> <span class="token number">100</span> <span class="token operator">+</span> <span class="token number">0.5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Wenn Du dagegen mit tatsächlichen Fließkommazahlen rechnen musst, dann ist der Test auf Gleichheit nicht mehr realisierbar. Statt dessen musst Du prüfen, ob die beiden Zahlen „nah genug“ beieinander liegen. Was „nah genug“ ist, kommt auf den Einzelfall an und muss bei jeder Rechnung neu überlegt werden. Du musst bedenken, dass ein double 15 signifikante Ziffern hat. Wenn deine Werte im Bereich von 1 liegen, dann liegt die "Auflösung" bei <code>1E-15</code>. Wenn deine Werte aber im Bereich von zehn Millionen liegen (was 7 Vorkommastellen sind), hast Du nur noch 8 Nachkommastellen. Die Auflösung liegt bei <code>1E-8</code>.</p> <p>Dein Schwellwert für "gleich genug" sollte 1-2 Größenordnungen über der numerischen Auflösung liegen, um Fehlerfortpflanzung in Rechnungen zu berücksichtigen.</p> <p>Statt <code>$a == $b</code> kannst Du also zum Beispiel <code>abs($a - $b) < 1E-13</code> testen. Oder <code>$a < $b - 1E-12</code> statt <code>$a < $b</code>. Das Spaceship kannst Du bei float vergessen. Und wie gesagt: Statt 1E-12 kann auch mal 1E-8 oder 0.001 korrekt sein, je nach Größenordnung der Zahlen, mit denen Du hantierst.</p> <p>Wenn Du vorher mit wilden Formeln herumgerechnet hast, musst Du deine Formeln eigentlich noch auf Fehlerfortpflanzung untersuchen, um zu wissen, wie groß dein Schwellwert für "nicht mehr gleich" sein muss. Je nachdem, wie Du rechnest, kann es auch sein, dass das Umstellen einer Formel den Rechenfehler massiv verbessert oder verschlimmert. Man kann statt Fehlerrechnung aber auch Testprogramme schreiben und die Formel mit verschiedenen Werten testen, um ein Gefühl für den durch Probieren herausbekommen.</p> <p>Aus gutem Grund ist Richtig Rechnen (a.k.a. Numerik) eins der gruseligsten Fächer im Mathe- oder Informatik-Studium.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 19:22:21 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772789#m1772789 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772789#m1772789 <p>Hallo Martin,</p> <blockquote> <p>Die übliche Strategie ist dann: Man legt eine maximal akzeptable Fehlerschwelle $error fest (z.B. $error=1E-6) und prüft dann nicht auf Gleichheit, sondern auf Einhaltung eines Toleranzbandes.</p> </blockquote> <p>Also eine Art Fuzzy-Logic Damit käme ich klar. Ich wußte nicht, ob es etwas "Besseres, Anderes, Klareres" gibt.</p> <p>Joachim</p> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 19:48:18 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772791#m1772791 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772791#m1772791 <p>Hallo Rolf,</p> <blockquote> <p>Aus gutem Grund ist Richtig Rechnen (a.k.a. Numerik) eins der gruseligsten Fächer im Mathe- oder Informatik-Studium.</p> </blockquote> <p>ich habe das Thema weder im Mathe-LK in der Schule, noch im Informatik-Studium kennengelernt, sondern erst im Beruf bei der <s>Berech</s> Abschätzung von Messunsicherheiten.<br> Und ich stimme dir zu: Das ist ... naja, vielleicht nicht gruselig, aber doch sehr lästig.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 07:18:07 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772797#m1772797 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772797#m1772797 <p>Hallo zusammen,</p> <p>sehr interessantes Thema und es wundert mich eigentlich, dass ich erst gestern darauf stoße. Dabei habe ich auch in der Vergangenheit oft mit Zahlen, auch Floatwerten gerechnet und sie verglichen.</p> <p>Im Grunde ist Deine Funktion toCents auch eine Art "Rundung". Ich hätte mir wirklich vorstellen können, dass PHP hier eigene Funktionen hat. </p> <p>Joachim</p> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 09:25:18 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772802#m1772802 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772802#m1772802 <p>Hallo,</p> <blockquote> <p>Wenn Du immer genau 2 Nachkommastellen hast, z.B. weil es Geld ist, dann rechne nicht mit Euro, sondern mit Cent. D.h. wenn Du "42.01" hereinbekommst, multipliziere es mit 100, addiere 0,5 und mache mit intval() eine Integerzahl draus.</p> </blockquote> <p>Ich meine, mal gehört zu haben, dass das auch nicht der Weisheit letzter Schluss ist. Banken benötigen für Zinsrechnungen weit mehr als Cent-Genauigkeit, möglicherweise reichen Hundertstel-Cent. Aber wenn man Geldbeträge mit 10000 multipliziert, um genaustens rechnen zu können, stößt man viel schneller an speichergrenzen bei großen Beträgen... Ein Dilemma.</p> <p>Daher werden meines Wissens Euro und Cent irgendwie getrennt verwaltet. Das kann aber längst veraltet oder Einbildung sein…</p> <p>Gruß<br> Kalk</p> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 19:54:05 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772792#m1772792 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772792#m1772792 <p>Hallo Der Martin,</p> <blockquote> <p>ich habe das Thema [Numerik] weder im Mathe-LK in der Schule</p> </blockquote> <p>ich kenne nicht einen einzigen Mathelehrplan, in dem das Thema Numerik stünde, wenn man mal von solchen Sachen wie dem Newton-Verfahren absieht, das sicherlich in dem einen oder anderen Bundesland in einem Wahlthema zu finden ist.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 20:21:08 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772793#m1772793 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772793#m1772793 <p>Hallo Matthias,</p> <p>Schüler würden, wenn Du ihnen mit den Feinheiten der Fehlerrechnung kommst, schreiend das Gebäude verlassen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Brett vorm Kopf. Finde den Fehler nicht. Tue, 30 Jun 20 20:55:27 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772794#m1772794 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772794#m1772794 <p>Hallo,</p> <blockquote> <p>Schüler würden, wenn Du ihnen mit den Feinheiten der Fehlerrechnung kommst, schreiend das Gebäude verlassen.</p> </blockquote> <p>das kann sein - ich weiß nicht, wie ich als Schüler reagiert hätte. Aber als ich mit den üblichen Methoden der Fehlerrechnung konfrontiert wurde, habe ich erstmal protestiert: Das stimmt doch gar nicht!</p> <p>Die traditionelle Methode besagt: Ergibt sich eine Größe als Produkt aus n einzelnen Messgrößen, die alle mit einer gewissen prozentualen Unsicherheit behaftet sind, addiere einfach die Prozentwerte, um die resultierende Unsicherheit zu erhalten.</p> <p>Stimmt nicht. Angenommen, ich messe Spannung und Strom mit einer Unsicherheit von je 10%, dann würde ich nach der beschriebenen Methode eine Unsicherheit von 20% für die Leistung bekommen. Tatsächlich sind es aber 21%, denn 1.1² = 1.21.</p> <p>In der HF-Messtechnik, wo viele Größen in dB gemessen werden, passt das wieder.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 06:33:33 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772796#m1772796 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772796#m1772796 <p>Moin,</p> <blockquote> <p>könnte man nicht mit Hilfe von <a href="https://www.php.net/manual/en/function.decbin" rel="nofollow noopener noreferrer"><code>decbin()</code></a> nachgucken, was PHP da im Hintergrund macht?</p> </blockquote> <p>was willst du damit herausfinden? Das liefert dir nur einen String mit der binären Darstellung einer Zahl. Also decbin(200) ergibt z.B. den String "11001000".</p> <p>Das hat nichts mit der internen Darstellung oder Speicherung von Variablenwerten zu tun.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 07:29:08 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772799#m1772799 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772799#m1772799 <p>Hallo Graf,</p> <p>im Gegensatz zur Doku wandelt decbin keinen <strong>dezimalen</strong> Wert ins Binärformat, sondern nur einen <strong>Integer</strong>-Wert. D.h. decbin(42.02) ergibt 101010, die Binärdarstellung von 42.</p> <p>Etwas näher könnte man der Sache mit debug_zval_dump() kommen - aber der lügt ebenfalls und sagt nur: <code>double(42.02)</code>. Dass da nicht 42.02 in der Variablen steht, sondern</p> <p>$$\displaystyle \frac{5913789260690883}{140737488355328} = 42.02000000000000312638803734444081783294677734375$$</p> <p>(danke an <a href="https://www.binaryconvert.com/result_double.html?decimal=052050046048050" rel="nofollow noopener noreferrer">binaryconvert.com</a> und <a href="https://www.wolframalpha.com/input/?i=10101000000101000111101011100001010001111010111000011_2+%2F+2%5E47" rel="nofollow noopener noreferrer">Wolfram Alpha</a>), das verrät er nicht.</p> <p>Was intern passiert, ist übrigens <a href="https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772768#m1772768" rel="noopener noreferrer">längst klar</a>.</p> <p>Liebe Grüße an den edlen Cousin, Graf Zahl!<br> <em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 07:26:59 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772798#m1772798 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772798#m1772798 <p>Moin Joachim,</p> <blockquote> <p>sehr interessantes Thema und es wundert mich eigentlich, dass ich erst gestern darauf stoße. Dabei habe ich auch in der Vergangenheit oft mit Zahlen, auch Floatwerten gerechnet und sie verglichen.</p> </blockquote> <p>das geht auch oft gut, aber irgendwann stößt man mal auf das Thema. Als Beispiel wird auch oft demonstriert, einen Startwert (z.B. 1.00) in einer Schleife pro Durchlauf um 0.10 zu erhöhen. Meist läuft das schon beim dritten oder vierten Schritt aus dem Ruder.</p> <blockquote> <p>Im Grunde ist Deine Funktion toCents auch eine Art "Rundung".</p> </blockquote> <p>Ja, aber nur einmalig, um von da an mit ganzzahligen Werten weiterzurechnen und weitere Rundungsfehler auszuschließen.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 09:04:09 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772801#m1772801 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772801#m1772801 <p>Hallo Rolf,</p> <blockquote> <p>im Gegensatz zur Doku wandelt decbin keinen <strong>dezimalen</strong> Wert ins Binärformat, sondern nur einen <strong>Integer</strong>-Wert. D.h. decbin(42.02) ergibt 101010, die Binärdarstellung von 42.</p> </blockquote> <p>das stimmt, der Name der Funktion ist schlecht gewählt.</p> <p>Einerseits ist <em>dezimal</em> hier nicht im Sinn eines Dezimalbruchs gemeint, sondern als Abgrenzung der Dezimaldarstellung einer Zahl zu anderen Zahlensystemen (hexadezimal, oktal).</p> <p>Andererseits ist auch das Unsinn, denn die Darstellung einer Zahl in irgendeinem Zahlensystem hat nichts damit zu tun, wie sie intern gespeichert wird. Mit decbin(0x1F04) würde ich die Bezeichnung ad absurdum führen.</p> <p>Daher wäre <strong>intbin</strong> tatsächlich die bessere, weil treffendere Bezeichnung.</p> <blockquote> <p>Etwas näher könnte man der Sache mit debug_zval_dump() kommen</p> </blockquote> <p>Oh, interessant. Das kannte ich noch gar nicht.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Float binär darstellen Fri, 03 Jul 20 04:26:14 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772894#m1772894 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772894#m1772894 <p>Hallo Ro.,<br> hallo @all,</p> <blockquote> <p>im Gegensatz zur Doku wandelt decbin keinen <strong>dezimalen</strong> Wert ins Binärformat, sondern nur einen <strong>Integer</strong>-Wert. D.h. decbin(42.02) ergibt 101010, die Binärdarstellung von 42.</p> <p>Etwas näher könnte man der Sache mit debug_zval_dump() kommen - aber der lügt ebenfalls und sagt nur: <code>double(42.02)</code>. Dass da nicht 42.02 in der Variablen steht, sondern</p> <p>$$\displaystyle \frac{5913789260690883}{140737488355328} = 42.02000000000000312638803734444081783294677734375$$</p> <p>(danke an <a href="https://www.binaryconvert.com/result_double.html?decimal=052050046048050" rel="nofollow noopener noreferrer">binaryconvert.com</a> und <a href="https://www.wolframalpha.com/input/?i=10101000000101000111101011100001010001111010111000011_2+%2F+2%5E47" rel="nofollow noopener noreferrer">Wolfram Alpha</a>), das verrät er nicht.</p> <p>Was intern passiert, ist übrigens <a href="https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772768#m1772768" rel="noopener noreferrer">längst klar</a>.</p> <p>Liebe Grüße an den edlen Cousin, Graf Zahl!</p> </blockquote> <p>Ok, reingefallen.</p> <p>Kennt denn irgendjemand hier eine Methode, um sich die Float-Werte binär darstellen zu lassen, also quasi ein direktes Speicherabbild der Variable zu visualisieren?</p> <p>Bit frei!<br> Graf Bit</p> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 09:33:05 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772803#m1772803 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772803#m1772803 <p>Hallo encoder,</p> <blockquote> <p>Die einzelne Zahl 188.2 lässt sich dagegen ohne Rundungsfehler darstellen</p> </blockquote> <p>Auch ohne einen IEEE754 Konverter widerspreche ich da. 0,2 ist $$\frac{1}{5}$$, das kannst Du nie als endliche Summe von Zweierpotenzen darstellen.</p> <p><a href="https://www.binaryconvert.com/result_double.html?decimal=049056056046050" rel="nofollow noopener noreferrer">IEEE754-Darstellung von 188,2</a>.</p> <p>So wie es aussieht, ist</p> <p>$$188{,}2 = 10111100{,}\overline{0011}$$</p> <p>Oder, klassisch konvertiert wie man es bei Dezimalbrüchen gelernt hat:</p> <p>$$188{,}2 = 188 + \frac{1}{5} = 188 + \frac{3}{15} = 10111100_2 + \frac{0011_2}{1111_2} = 10111100{,}\overline{0011}_2$$</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 09:33:16 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772804#m1772804 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772804#m1772804 <p>Hi,</p> <blockquote> <blockquote> <p>Wenn Du immer genau 2 Nachkommastellen hast, z.B. weil es Geld ist, dann rechne nicht mit Euro, sondern mit Cent. D.h. wenn Du "42.01" hereinbekommst, multipliziere es mit 100, addiere 0,5 und mache mit intval() eine Integerzahl draus.</p> </blockquote> <p>Ich meine, mal gehört zu haben, dass das auch nicht der Weisheit letzter Schluss ist. Banken benötigen für Zinsrechnungen weit mehr als Cent-Genauigkeit, möglicherweise reichen Hundertstel-Cent.</p> </blockquote> <p>das fängt bei den Tankstellen schon an, die zumindest intern auch mit den Zehntel-Cent rechnen.</p> <blockquote> <p>Aber wenn man Geldbeträge mit 10000 multipliziert, um genaustens rechnen zu können, stößt man viel schneller an speichergrenzen bei großen Beträgen... Ein Dilemma.</p> </blockquote> <p>Tja, irgendeinen Haken gibt's immer. <br> Es gibt noch andere Möglichkeiten. Traditionelle Taschenrechner verwenden AFAIK BCD-Arithmetik, d.h. Zahlen werden intern als BCD gespeichert und verarbeitet. So kann man zumindest im Dezimalsystem, das ja die meisten von uns primär verwenden, ohne Rundungsfehler rechnen.</p> <blockquote> <p>Daher werden meines Wissens Euro und Cent irgendwie getrennt verwaltet. Das kann aber längst veraltet oder Einbildung sein…</p> </blockquote> <p>Ich kann mir nicht vorstellen, was das für einen Vorteil bringen könnte.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 10:10:43 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772806#m1772806 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772806#m1772806 <p>Hallo Tabellenkalk,</p> <blockquote> <p>Banken benötigen für Zinsrechnungen weit mehr als Cent-Genauigkeit, möglicherweise reichen Hundertstel-Cent.</p> </blockquote> <p>Ich bin damals bei der Euro-Konvertierung unseres Versichertenbestandes nicht beteiligt gewesen, ich weiß aber, dass der Standard-Eurorechner, den wir damals zugekauft hatten (sic!) mit Hundertstel-Cent gerechnet hat. Und ich meine mal irgendwo gelesen zu haben, dass im Buchhaltungswesen das Rechnen mit Hundertstel-Cent und genaue Vorschriften, wann wie zu runden ist, vorgegeben sind. Das mag aber jetzt Fake-Memory sein.</p> <p>Euro und Cent getrennt zu verwalten, tja, das ist ggf als Workaround nötig und wird bei Punktrechnung umständlich. Aber nötig ist es nur bei alter Software. Der Klassiker ist hier COBOL mit dem COMP-3 Format, das früher maximal 18 Ziffern konnte (entspricht dem Umfang eines 64-bit Integer). Wenn man sich dem Billiardenbereich nähert, ist man bei 4 Nachkommastellen am Ende. Der IBM Compiler hat die ARITH(EXTEND) Option, dann wird der Code langsamer, kann aber 31 Ziffern verarbeiten. Der .net Decimal Typ kann 28 Ziffern. Mit diesen Grenzen hat vermutlich nur <a href="https://de.wikipedia.org/wiki/Venezolanischer_Bol%C3%ADvar#Bol%C3%ADvar_soberano_(seit_20._August_2018)" rel="nofollow noopener noreferrer">Venezuela</a> ein Problem, aber die haben ja auch Übung in Währungsschnitten.</p> <p>Java legt mit BigDecimal deutlich was drauf, und in JavaScript kann man immerhin BigInt verwenden.</p> <p>IBM COBOLs Datenbankpartner DB2 speichert 31 stellige Decimals, MS SQL Server speichert DECIMAL bis zu 38 Ziffern und MySQL bis 65.</p> <p>Also - machbar ist's auch ohne Cent-Quarantäne.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 21:35:56 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772848#m1772848 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772848#m1772848 <p>Mit dieser Argumentation stimmt das.<br> Dann stellt die Seite das wohl falsch dar und rundet sich irgendwas schön.</p> Brett vorm Kopf. Finde den Fehler nicht. Wed, 01 Jul 20 09:40:09 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772805#m1772805 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772805#m1772805 <p>Hi,</p> <blockquote> <p>Tja, irgendeinen Haken gibt's immer. <br> Es gibt noch andere Möglichkeiten. Traditionelle Taschenrechner verwenden AFAIK BCD-Arithmetik, d.h. Zahlen werden intern als BCD gespeichert und verarbeitet. So kann man zumindest im Dezimalsystem, das ja die meisten von uns primär verwenden, ohne Rundungsfehler rechnen.</p> </blockquote> <p>Nö, denn der Speicher ist begrenzt - Brüche wie 1/3 oder 1/7 werden also irgendwo irgendwie gerundet ...</p> <p>cu,<br> Andreas a/k/a MudGuard</p> Float binär darstellen Fri, 03 Jul 20 07:12:36 Z https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772900#m1772900 https://forum.selfhtml.org/self/2020/jun/30/brett-vorm-kopf-finde-den-fehler-nicht/1772900#m1772900 <p>Hallo Graf Bit,</p> <p>wenn Du die interne Repräsentation einer Variablen in PHP abrufen willst, dann solltest Du den Gedanken gleich wieder streichen. Abgesehen davon bietet Dir PHP, solange Du nicht selbst eine Erweiterung programmierst, keinen Zugang zu den internen Strukturen.</p> <p><a href="https://nikic.github.io/" rel="nofollow noopener noreferrer">Nikita Popov</a> von Jetbrains (die Macher von PHPStorm) hat in den letzten Jahren wenig gebloggt, aber: er hat 2015 zwei ausführliche Artikel über die interne Ablage von PHP 7 Variablen geschrieben und es auch mit PHP 5 verglichen.</p> <p>TL;DR: Diese Speicherung ist versionsabhängig und kann sich mit jedem PHP Release ändern.</p> <p>Aber um dem double-Problem auf die Spur zu kommen: PHP führt bei der String-Umwandlung eines double-Wertes offenbar selbst schon eine Rundung durch, um diese winzig kleinen IEEE-754 Abweichungen zu kompensieren. Wenn Du diese Rundung aushebeln willst, kannst Du printf statt echo verwenden (oder sprintf, wenn Du es in einem String speichern statt ausgeben willst):</p> <pre><code class="block language-php"><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"%.53f"</span><span class="token punctuation">,</span> <span class="token number">42.02</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Schreibt 42.02000000000000312638803734444081783294677734375000000</span> </code></pre> <p>Das passt zu dem, was der binaryconverter erzeugt hat, den ich verlinkt hatte.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div>