tag:forum.selfhtml.org,2005:/self Multiplikation – SELFHTML-Forum 2011-03-08T05:51:29Z https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496514#m1496514 Jens-Staufenberg 2011-02-26T09:42:59Z 2011-02-26T09:42:59Z Multiplikation <p>Guten Tag,</p> <p>ich bin absoluter Anfänger in PHP man möge mir daher Anfängerfehler verzeihen.<br> Folgendes Problem:<br> <code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0.5" (man beachte Punkt nicht Komma, und keine Leerstellen)</p> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0"</p> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0"</p> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token number">0.5</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "12" <- das gewünschte Ergebnis</p> <p>Was mache ich denn falsch?</p> <p></p> https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496519#m1496519 dedlfix 2011-02-26T09:57:14Z 2011-02-26T09:57:14Z Multiplikation <p>Hi!</p> <blockquote> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0.5" (man beachte Punkt nicht Komma, und keine Leerstellen)<br> <code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0"<br> <code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token number">0.5</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "12" <- das gewünschte Ergebnis<br> Was mache ich denn falsch?</p> </blockquote> <p>echo '"' . ('0.5' * 24) . '"';<br> ergibt auch "12". Du hast was anderes in $datensatz->max stehen als angezeigt wird. Lass dir den Inhalt mit var_dump() anzeigen. Wenn dabei eine andere Länge als 3 angezeigt wird, gib zusätzlich den Wert mit echo urlencode($datensatz->max); aus.</p> <p>Lo!</p> https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496518#m1496518 Matti Mäkitalo matti@fanalin.de http://www.fanalin.de 2011-02-26T10:03:14Z 2011-02-26T10:03:14Z Multiplikation <p>Hi,</p> <blockquote> <p>Folgendes Problem:<br> <code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0.5" (man beachte Punkt nicht Komma, und keine Leerstellen)</p> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0"</p> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0"</p> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token number">0.5</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "12" <- das gewünschte Ergebnis</p> <p>Was mache ich denn falsch?</p> </blockquote> <p>Kannst du ein komplettes Beispiel posten, an dem man den Fehler nachvollziehen kann?<br> Ich habe mir eins gebaut (s.u.), und bei mir funktioniert alles wie erwartet.</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?PHP</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Datensatz</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token variable">$max</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"0.5"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$datensatz</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Datensatz</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token doctype"><span class="token punctuation"><!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>html</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>UTF-8<span class="token punctuation">'</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>title</span><span class="token punctuation">></span></span>Test<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span>"<span class="token php language-php"><span class="token delimiter important"><?PHP</span> <span class="token keyword">echo</span> <span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span>"<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span>"<span class="token php language-php"><span class="token delimiter important"><?PHP</span> <span class="token keyword">echo</span> <span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">*</span><span class="token number">24</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span>"<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token php language-php"><span class="token delimiter important"><?PHP</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span> <span class="token operator">.</span> <span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">*</span><span class="token number">24</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>html</span><span class="token punctuation">></span></span> </code></pre> <p>Bis die Tage,<br> Matti</p> <div class="signature">-- <br> <a href="http://tntnet.org/" rel="nofollow noopener noreferrer">Webapplikationen in C++ entwickeln</a> </div> https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496515#m1496515 MudGuard http://www.andreas-waechter.de/ 2011-02-26T10:07:19Z 2011-02-26T10:07:19Z Multiplikation <p>Hi,</p> <blockquote> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0.5" (man beachte Punkt nicht Komma, und keine Leerstellen)</p> </blockquote> <p>Der String wird direkt ausgegeben.</p> <blockquote> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0"</p> </blockquote> <p>Der String wird, um ihn mit dem Integer multiplizieren zu können, in einen Integer gewandelt.<br> Welche Locale hast Du eingestellt? Ich hätte hier 24 erwartet - aber vielleicht ist  in der verwendeten Locale der . kein Dezimaltrennzeichen ...<br> Oder es wird bei String->Integer-Umwandlung beim ersten nicht-Integer-Zeichen abgebrochen ...</p> <blockquote> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0"</p> </blockquote> <p>Die Klammern dürfen keinen Unterschied zum vorherigen Fall machen.</p> <blockquote> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token number">0.5</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "12" <- das gewünschte Ergebnis</p> </blockquote> <p>Der Integer 24 wird für die Multiplikation mit dem Float nach Float gewandelt, dann gerechnet.</p> <blockquote> <p>Was mache ich denn falsch?</p> </blockquote> <p>Vermutlich ist der Fehler, daß $datensatz->max ein String ist.</p> <p>cu,<br> Andreas</p> <div class="signature">-- <br> <a href="http://MudGuard.de/" rel="nofollow noopener noreferrer">Warum nennt sich Andreas hier MudGuard?</a><br> <a href="http://ostereier.andreas-waechter.de/" rel="nofollow noopener noreferrer">O o ostern ...</a><br> Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.<br> </div> https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496517#m1496517 Matti Mäkitalo matti@fanalin.de http://www.fanalin.de 2011-02-26T10:10:15Z 2011-02-26T10:10:15Z Multiplikation <p>Hi,</p> <blockquote> <blockquote> <p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br> erzeugt "0"</p> </blockquote> <p>Der String wird, um ihn mit dem Integer multiplizieren zu können, in einen Integer gewandelt.</p> </blockquote> <p>Nein, ich habe ein komplettes Beispiel gepostet (und auch dedlfix hat das als Fehlerquelle eliminiert). Selbst wenn <code class="language-php"><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span></code> ein String ist, kommt dabei 12 raus. Der Fehler ist woanders.</p> <p>Bis die Tage,<br> Matti</p> <div class="signature">-- <br> <a href="http://tntnet.org/" rel="nofollow noopener noreferrer">Webapplikationen in C++ entwickeln</a> </div> https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496516#m1496516 Christian Kruse c--j--k--remove-dashes@wwwtech.de http://wwwtech.de/ 2011-03-08T05:51:29Z 2011-03-08T05:51:29Z Multiplikation <p>Moin MudGuard,</p> <blockquote> <blockquote> <p>[…]<br> Der String wird, um ihn mit dem Integer multiplizieren zu können, in einen Integer gewandelt.<br> Welche Locale hast Du eingestellt?</p> </blockquote> </blockquote> <p>Das ist locale-Unabhängig:</p> <pre><code class="block"> ckruse@hermes ~ $ php -r 'setlocale(LC_ALL,"de_DE.UTF-8"); echo 0.5,"\n";' 0,5 ckruse@hermes ~ $ php -r 'setlocale(LC_ALL,"de_DE.UTF-8"); echo "0.5" * 2,"\n";' 1 ckruse@hermes ~ $ php -r 'setlocale(LC_ALL,"de_DE.UTF-8"); echo "0,5" * 2,"\n";' 0 ckruse@hermes ~ $ php -v PHP 5.3.3 (cli) (built: Jan  7 2011 19:14:34) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies ckruse@hermes ~ $ </code></pre> <p>Lediglich bei der Ausgabe wird das Trennzeichen aus dem Locale genutzt. Hm, und scheinbar auch das nur, wenn das Locale im Script explizit gesetzt wurde…</p> <pre><code class="block"> ckruse@hermes ~ $ locale LANG="de_DE.UTF-8" LC_COLLATE="de_DE.UTF-8" LC_CTYPE="de_DE.UTF-8" LC_MESSAGES="de_DE.UTF-8" LC_MONETARY="de_DE.UTF-8" LC_NUMERIC="de_DE.UTF-8" LC_TIME="de_DE.UTF-8" LC_ALL="de_DE.UTF-8" ckruse@hermes ~ $ php -r 'echo 0.5,"\n";' 0\.5 ckruse@hermes ~ $ php -r 'echo setlocale(LC_ALL,NULL)," ",0.5,"\n";' de_DE.UTF-8 0,5 ckruse@hermes ~ $ </code></pre> <p>Wirklich merkwürdig. Und irgendwie typisch PHP, die Sprache nervt mich seit geraumer Zeit gewaltig…</p> <blockquote> <p>Ich hätte hier 24 erwartet - aber vielleicht ist  in der verwendeten Locale der . kein Dezimaltrennzeichen ...<br> Oder es wird bei String->Integer-Umwandlung beim ersten nicht-Integer-Zeichen abgebrochen ...</p> </blockquote> <p>Beim parsen von Zahlen wird nur der Punkt als Dezimal-Trennzeichen akzeptiert. s.o. :)</p> <p>LG,<br>  CK</p> <div class="signature">-- <br> <a href="http://ck.kennt-wayne.de/" rel="nofollow noopener noreferrer">http://ck.kennt-wayne.de/</a><br> </div> https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496520#m1496520 Jens-Staufenberg 2011-02-26T10:15:32Z 2011-02-26T10:15:32Z Multiplikation <blockquote> <p>echo '"' . ('0.5' * 24) . '"';<br> ergibt auch "12".</p> </blockquote> <p>Stimmt es kommt auch 12 bei mir heraus.</p> <blockquote> <p>Du hast was anderes in $datensatz->max stehen als angezeigt wird. Lass dir »» den Inhalt mit var_dump() anzeigen.</p> </blockquote> <p><code class="language-php"><span class="token keyword type-declaration">object</span><span class="token punctuation">(</span>SimpleXMLElement<span class="token punctuation">)</span><span class="token comment">#16 (1) { [0]=> string(3) "0.5" }</span></code></p> <p>»»Wenn dabei eine andere Länge als 3 angezeigt wird, gib zusätzlich den Wert »»mit echo urlencode($datensatz->max); aus.<br> Es kommt ja 3 dabei heraus von daher!?</p> <p>Mein zweiter versuch war ein IF Anweisung<br> <code class="language-php"><span class="token keyword">IF</span> <span class="token punctuation">(</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</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 keyword">echo</span> <span class="token string single-quoted-string">'stimmt'</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code><br> auch ist die IF Anwendung "TRUE" und das Ergebnis "stimmt" wird angezeigt.</p> https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496522#m1496522 Kai345 kai345@knrs.de http://knrs.de 2011-02-26T13:31:13Z 2011-02-26T13:31:13Z Multiplikation <p>[latex]Mae  govannen![/latex]</p> <blockquote> <blockquote> <p>Du hast was anderes in $datensatz->max stehen als angezeigt wird. Lass dir »» den Inhalt mit var_dump() anzeigen.</p> </blockquote> <p><code class="language-php"><span class="token keyword type-declaration">object</span><span class="token punctuation">(</span>SimpleXMLElement<span class="token punctuation">)</span><span class="token comment">#16 (1) { [0]=> string(3) "0.5" }</span></code></p> </blockquote> <p>Also kein String oder eine Zahl, sondern ein SimpleXML-Objekt. Der Wert wird zwar bei der Ausgabe in einen String gewandelt, aber nicht bei Rechenoperationen.</p> <p><a href="http://www.php.net/manual/de/language.types.type-juggling.php#language.types.typecasting" rel="nofollow noopener noreferrer">Typecasting</a> sollte helfen.</p> <p>Stur lächeln und winken, Männer!<br> Kai</p> <div class="signature">-- <br> Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken<br> in Richtung "Mess up the Web".(<a href="https://forum.selfhtml.org/?t=197497&m=1324775" rel="noopener noreferrer">suit</a>)<br> <a href="http://selfhtml.knrs.de/#h_stylesheet" rel="nofollow noopener noreferrer">SelfHTML-Forum-Stylesheet</a> </div> https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496521#m1496521 dedlfix 2011-02-26T14:24:08Z 2011-02-26T14:24:08Z Multiplikation <p>Hi!</p> <blockquote> <blockquote> <p>Du hast was anderes in $datensatz->max stehen als angezeigt wird. Lass dir den Inhalt mit var_dump() anzeigen.<br> object(SimpleXMLElement)#16 (1) { [0]=> string(3) "0.5" }<br> Wenn dabei eine andere Länge als 3 angezeigt wird, [...]<br> Es kommt ja 3 dabei heraus von daher!?</p> </blockquote> </blockquote> <p>Ja und nein. Ich ging davon aus, dass es zwar ein String ist, aber da irgendwas Unsichtbares enthalten ist. Aber als String hättest du nur<br>   string(3) "0.5"<br> oder etwas Ähnliches als Ausgabe von var_dump() bekommen. Du bekommst aber ein Objekt. Das Rätsel löst sich durch die Kontrollausgabe, weil nun herauskommt, dass SimpleXML seine Finger im Spiel hat. Dies hat eine Menge eingebaute <a href="http://de.php.net/manual/en/language.oop5.magic.php" rel="nofollow noopener noreferrer">Magie</a>, die in manchen Situationen beispielsweise ein SimpleXMLElement wie ein String und manchmal wie ein Array aussehen lässt. Und da hilft dir die schon empfohlene Typumwandlung. Hier ein Beispiel zum Nachvollziehen:</p> <p>echo '<pre>';<br> $x = simplexml_load_string('<root>0.5</root>');<br> var_dump($x); # Ausgabe ähnlich wie bei dir</p> <h3>Ausgabe: 0.5 - PHP erkennt Stringkontext und ruft __toString() vom SimpleXMLElement auf.</h3><p>echo $x, "\n";</p> <h3>Ausgabe: float(0.5) - da es kein __toFloat() gibt, nehme ich an,</h3><h3>dass __toString() aufgerufen wird und anschließend der Typecast nach float stattfindet.</h3><p>var_dump((float)$x);</p> <h3>Ausgabe 12</h3><p>echo (float)$x * 24;</p> <p>Lo!</p>