<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[String to Double Problem]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe da ein Problem:<br />
Ich will einen String &quot;27.95&quot; in ein double Wandeln.</p>
<p>Den STring bekomme ich von der RS232 Schnittstelle und habe ihn schon von der überflüssigen last befreit und er liegt jetzt so vor: &quot;27.95&quot; als</p>
<pre><code>char temp_weight[10]
</code></pre>
<p>. Jetzt versuche ich diesen String mittels atof oder strtod in ein double zu wandeln.</p>
<pre><code>double temp_d=atof(temp_weight);
</code></pre>
<p>und bekomme für temp_d 27.949999999999999 raus.<br />
wenn ich jetzt den String im Code anlege bekomme ich 27.95 raus.<br />
Habt ihr ne Idee woran das liegen kann.</p>
<p>mit strtod bekomme ich das gleiche und wenn ich anstatt double einen float nehme bekomme ich 27.950001</p>
<p>Ich Arbeite mit Visual Studio 2008 und einem Windows Embedded CE 6.0 System auf einem ARM controller.</p>
<p>Viellen Dank für die Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272081/string-to-double-problem</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 01:03:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272081.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Aug 2010 08:37:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 08:37:59 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe da ein Problem:<br />
Ich will einen String &quot;27.95&quot; in ein double Wandeln.</p>
<p>Den STring bekomme ich von der RS232 Schnittstelle und habe ihn schon von der überflüssigen last befreit und er liegt jetzt so vor: &quot;27.95&quot; als</p>
<pre><code>char temp_weight[10]
</code></pre>
<p>. Jetzt versuche ich diesen String mittels atof oder strtod in ein double zu wandeln.</p>
<pre><code>double temp_d=atof(temp_weight);
</code></pre>
<p>und bekomme für temp_d 27.949999999999999 raus.<br />
wenn ich jetzt den String im Code anlege bekomme ich 27.95 raus.<br />
Habt ihr ne Idee woran das liegen kann.</p>
<p>mit strtod bekomme ich das gleiche und wenn ich anstatt double einen float nehme bekomme ich 27.950001</p>
<p>Ich Arbeite mit Visual Studio 2008 und einem Windows Embedded CE 6.0 System auf einem ARM controller.</p>
<p>Viellen Dank für die Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938176</guid><dc:creator><![CDATA[steffen1982]]></dc:creator><pubDate>Tue, 10 Aug 2010 08:37:59 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 08:48:46 GMT]]></title><description><![CDATA[<p>27.95 ist eben als double bzw. float nicht exakt darstellbar...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938181</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 10 Aug 2010 08:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 09:34:00 GMT]]></title><description><![CDATA[<p>dot hat recht. Die Zahlen, die double bzw float exakt darstellen kann, sind eine relativ kleine Untermenge der dyadischen Zahlen. 27,95 gehört nicht dazu.</p>
<p>27.95 = 11011,111100110011001100110011001100110011001100110011 00110011...<sub>2</sub> (endlos)</p>
<p>double speichert <a href="http://de.wikipedia.org/wiki/IEEE_754" rel="nofollow">typischerweise</a> nur die ersten 53 Bits einer solchen Sequenz. Unter dieser Annahme entstünde hier durch das Abschneiden ein Fehler von 1/5 * 2<sup>-48</sup>.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938202</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 10 Aug 2010 09:34:00 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 09:37:45 GMT]]></title><description><![CDATA[<p><a href="http://lmgtfy.com/?q=Gleitkommazahl" rel="nofollow">http://lmgtfy.com/?q=Gleitkommazahl</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938204</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 10 Aug 2010 09:37:45 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 11:43:27 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Danke krümelkacker für deine gute Erklärung. Jetzt stellt sich die Frage warum funktioniert es bei einem Direkteingegebenem String? Und wie wird diese Problem gelöst. Gibt es eine Lösung oder nehmen es alle so hin? Soll ich jetzt eine Gleitkommaklasse selbst schreiben oder weiß jemand eine gute Implementierung?</p>
<p>Gruß Steffen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938274</guid><dc:creator><![CDATA[steffen1982]]></dc:creator><pubDate>Tue, 10 Aug 2010 11:43:27 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 11:52:36 GMT]]></title><description><![CDATA[<p>steffen1982 schrieb:</p>
<blockquote>
<p>Gibt es eine Lösung oder nehmen es alle so hin?</p>
</blockquote>
<p>Was heißt hier Lösung? Du musst erstmal formulieren, wo das Problem liegt. Dann können wir dir eine Lösung nennen.</p>
<p>Geht es dir darum, alle Zahlen die im Dezimalsystem exakt darstellbar sind, im Computer exakt darzustellen? Dann lautet das Schlüsselwort Binary-coded Decimal. Oder wenn es um alle rationalen Zahlen geht, dann brauchst du eine Klasse für Bruchzahlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938284</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 10 Aug 2010 11:52:36 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 11:53:47 GMT]]></title><description><![CDATA[<p>Die Frage ist eher: Warum genau hast du ein Problem damit dass es 27.9500001 ist?<br />
Was meinst du mit &quot;direkteingegebenem string&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938285</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 10 Aug 2010 11:53:47 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 12:16:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>weil ich ein Messgerät entwickle und im späteren verlauf auch Formeln berechnen will und bei denen garantieren muß das ich die Rundungseffekte im Griff habe und wenn dann selbst erzeuge. Für die Angezeigte Genauigkeit reichen villeicht 5-6 Stellen hinterm Komma. aber in der Rechnung werden halt die vollen double Kommastellen verwendet. Also um genaue Zahlen angeben zu können muß wohl eine eigene Klasse herhalten.</p>
<pre><code>char temp_weight2[10];
strcpy(temp_weight2,&quot;27.95&quot;);
double temp_d22=atof(temp_weight2);
</code></pre>
<p>Wenn ich den String so eingebe bekomme ich im double genau 27.95 raus? Kann das mit Copilervereinfachungen zu tun haben. Wobei dann die 27.95 im Double ja darstellbar währen.</p>
<p>Gruß Steffen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938298</guid><dc:creator><![CDATA[steffen1982]]></dc:creator><pubDate>Tue, 10 Aug 2010 12:16:29 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 12:19:21 GMT]]></title><description><![CDATA[<p>Die Matisse wird einfach verändert, dadurch erhälst du dann den &quot;exakten&quot; Wert, aber du darfst nicht vergessen, dass bei Komplexen Rechnungen die Rundungsfehler akkumulieren</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938300</guid><dc:creator><![CDATA[ziv]]></dc:creator><pubDate>Tue, 10 Aug 2010 12:19:21 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 12:21:48 GMT]]></title><description><![CDATA[<p>Warum so C-ig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938303</guid><dc:creator><![CDATA[Icematix]]></dc:creator><pubDate>Tue, 10 Aug 2010 12:21:48 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 12:28:23 GMT]]></title><description><![CDATA[<p>steffen1982 schrieb:</p>
<blockquote>
<pre><code>char temp_weight2[10];
strcpy(temp_weight2,&quot;27.95&quot;);
double temp_d22=atof(temp_weight2);
</code></pre>
<p>Wenn ich den String so eingebe bekomme ich im double genau 27.95 raus?</p>
</blockquote>
<p>Hallo Steffen,</p>
<p>was macht Dich so sicher, dass in 'temp_d22' exakt 27.95 steht?<br />
dot und krümelkacker haben schon versucht Dir zu erklären, dass das gar nicht möglich ist, weil 27.95 (im Dezimalsystem) im Binärsystem eine 'krumme' Zahl ist.</p>
<p>Und wenn Du nur 5-6Stellen Genauigkeit benötigst, so ist das doch ok. Der besagte Rundungsfehler macht sich erst ab der 13. oder 14. (dezimal)Stelle bemerkbar - also bei Zahlen von 10 bis unter 100 frühestens ab der 11. Nachkommastelle.</p>
<p>Welcher Art sind Deine Berechnungen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938313</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Tue, 10 Aug 2010 12:28:23 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 12:37:10 GMT]]></title><description><![CDATA[<p>ziv schrieb:</p>
<blockquote>
<p>Die Matisse wird einfach verändert, dadurch erhälst du dann den &quot;exakten&quot; Wert, aber du darfst nicht vergessen, dass bei Komplexen Rechnungen die Rundungsfehler akkumulieren</p>
</blockquote>
<p>so komplex braucht eine Berechnung gar nicht sein. Probiert mal dies aus:</p>
<pre><code class="language-cpp">double d = 0.;
    for( int i=0; i&lt;10; ++i )
        d += 0.1;
    assert( d == 1.0 ); // d ist hier != 1.0
</code></pre>
<p>der Fehler liegt hier nicht in der Addition eines double, sondern zwischen den Ohren des Programmierers <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938320</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Tue, 10 Aug 2010 12:37:10 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 12:56:40 GMT]]></title><description><![CDATA[<p>steffen1982 schrieb:</p>
<blockquote>
<pre><code>char temp_weight2[10];
strcpy(temp_weight2,&quot;27.95&quot;);
double temp_d22=atof(temp_weight2);
</code></pre>
<p>Wenn ich den String so eingebe bekomme ich im double genau 27.95 raus? Kann das mit Copilervereinfachungen zu tun haben. Wobei dann die 27.95 im Double ja darstellbar währen.</p>
</blockquote>
<p>Nein. 27,95 ist nicht exakt darstellbar. Punkt. Konvertierungen zwischen double und &quot;dezimalen Zeichenketten&quot; sind nur Approximationen -- in beiden Richtungen!</p>
<p>Wenn Du an einer verlustfreien string-&gt;double-&gt;string Konvertierungskette interessiert bist, darfst Du wegen der endlichen Genauigkeit von double nur maximal 15 Dezimalstellen bei Ein- <strong>und</strong> Ausgabe verwenden.</p>
<p>Wenn Du an einer verlustfreien double-&gt;string-&gt;double Konvertierungskette interessiert bist, musst Du für den String in der Mitte bis zu 17 Dezimalstellen verwenden.</p>
<p>(Obiges gilt under der Annahme von IEEE 754 64-Bit doubles)</p>
<p>Bitte mach Dich nochmal <a href="http://docs.sun.com/source/806-3568/ncg_goldberg.html" rel="nofollow">schlau</a>, wie das mit den Gleitkommazahlen funktioniert.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938336</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 10 Aug 2010 12:56:40 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 12:59:10 GMT]]></title><description><![CDATA[<p>ich schreibe so C Lastig da ich aus dem Embedded Bereich komme und c als erstes gelehrt habe. aber ich bin für andere möglichkeiten immer offen.</p>
<p>Ich bin nicht sicher das in 'temp_d22' exakt 27.95 steht.<br />
Ich sehe die double Werte im Debugger hier wird im selben Momment für 'temp_d22' 27,95 und für 'temp_d' 27,9499999 steht beide sind aus einem String entstanden und mit der atof Funktion in einen double gewandet worden. Der einzige unterschied der eine String wurde fest Codiert der andere Stammt von der RS. Beide sehen im Debugger genau gleich aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938339</guid><dc:creator><![CDATA[steffen1982]]></dc:creator><pubDate>Tue, 10 Aug 2010 12:59:10 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 13:24:00 GMT]]></title><description><![CDATA[<p>MSVC ist aber auch bekannt dafür, bei double&lt;-&gt;string Konvertierungen schlecht zu runden -- und Runden muss man da fast immer, egal in welcher Konvertierungsrichtung.</p>
<p>Was der Debugger anzeigt muss auch nicht das gleiche sein, wie das, was auf der Konsole landed. Der Debugger könnte eine andere double-&gt;string Konvertierung benutzen.</p>
<p>Gibt doch mal ein vollständiges Beispiel, was sich bei Dir Deiner Meinung nach &quot;komisch&quot; verhält, so dass man das mal selbst testen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938360</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 10 Aug 2010 13:24:00 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 19:00:22 GMT]]></title><description><![CDATA[<p>Wo bleibt das Beispiel, ich habe auch noch was besseres zu tun als hier Noobs zu helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938465</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 10 Aug 2010 19:00:22 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 20:24:12 GMT]]></title><description><![CDATA[<blockquote>
<p>Wo bleibt das Beispiel, ich habe auch noch was besseres zu tun als hier Noobs zu helfen.</p>
</blockquote>
<p>Da hat sich wohl jemand einen Spaß erlaubt und sich als &quot;krümelkacker&quot; ausgegeben. Dann ist die Registrierung ja doch zu was gut. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938484</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 10 Aug 2010 20:24:12 GMT</pubDate></item><item><title><![CDATA[Reply to String to Double Problem on Tue, 10 Aug 2010 20:48:45 GMT]]></title><description><![CDATA[<p>na geht doch krümelkacker</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938492</guid><dc:creator><![CDATA[Reghelper]]></dc:creator><pubDate>Tue, 10 Aug 2010 20:48:45 GMT</pubDate></item></channel></rss>