myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Mehrmaliges addieren von 0.1 auf eine Zahl vom Typ double gibt *.9999 oder *.*00001 aus
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Mehrmaliges addieren von 0.1 auf eine Zahl vom Typ double gibt *.9999 oder *.*00001 aus

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Badaboo Badaboo ist männlich
myCSharp.de-Mitglied

Dabei seit: 25.01.2019
Beiträge: 4


Badaboo ist offline

Mehrmaliges addieren von 0.1 auf eine Zahl vom Typ double gibt *.9999 oder *.*00001 aus

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Liebe Forumsgemeinde,

bin leider über die Suchfunktion nicht fündig geworden, daher erstelle ich nun diesen Thread. Ich bin gerade dabei mir via Selbststudium und etlichen Büchern C# beizubringen. Stehe aber seit gestern vor einem Problem bzw. einem Rätsel, dass mich leider geistig am Weitermachen hindert solange ich das nicht verstanden / begriffen habe =)

C#-Code:
            double z = 0.0;
            z = z + 0.1;

Wenn ich mit Visual Studio einen Button erzeuge, der immer 0.1 auf z hinzuaddiert, dann passiert folgendes:

Beim Sprung von 5.9 auf 6.0 - spuckt er nicht 6.0 aus sondern 5.9999periodisch.
Wenn man weiteraddiert, dann spuckt er irgendwann beim Sprung von 13.7999999 plötzlich 13.8000001 aus.

Alles ziemlich strange.

Wenn ich der Variable den Startwert 5.9 gebe und addiere, dann rechnet er sauber 6.0 - dann kommt dieses periodische Ergebnis halt irgendwann bei 8.79999999999.

Also entweder ich hab in Mathe echt nicht aufgepasst und eine Regel vom addieren nicht verstanden oder hier läuft mächtig was falsch =) Das macht mich noch verrückt.

Kann mir das bitte einer erklären.

Vielen Dank und schöne Grüße
Badaboo
25.01.2019 08:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.976
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das liegt an der Art und Weise, wie Computer gebrochene Zahlen speichern.

 http://effbot.org/pyfaq/why-are-floating...-inaccurate.htm

Versuch's mal mit decimal stattdessen. Hat zwar das selbe grundlegende Problem, aber mehr Platz zum Speichern und ist daher genauer.

LaTino

EDIT: war hier im Forum auch schon oft Thema:  [FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von LaTino am 25.01.2019 08:30.

25.01.2019 08:27 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
M.L.
myCSharp.de-Mitglied

Dabei seit: 26.09.2006
Beiträge: 201
Entwicklungsumgebung: VS Community '19


M.L. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
in Mathe echt nicht aufgepasst

Kann sein, zusätzlich ist Gleitkommadarstellung im Rechner ein Problem der  Numerischen Mathematik
25.01.2019 10:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.251
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Im Prinzip steht das auch alles in der Dokumentation zu  Double; inkl. dem Hinweis, wie man gegen Double vergleicht: mit einer Toleranz.
Leider zeigen vielen Snippets bei der Toleranz die Verwendung von Epsilon: die Dokumentation unterstreicht jedoch, dass man genau das nicht tun sollte.
Ich habe dies als Hinweis in der FAQ angefügt.
25.01.2019 14:37 Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.603
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

...weil das Epsilon von .NET nicht jenem Epsilon in der Numerik entspricht (leider). In der FAQ steht jedoch wie das in der Numerik übliche Epsilon ermittelt werden kann.

mfG Gü
27.01.2019 11:54 Beiträge des Benutzers | zu Buddylist hinzufügen
Badaboo Badaboo ist männlich
myCSharp.de-Mitglied

Dabei seit: 25.01.2019
Beiträge: 4

Themenstarter Thema begonnen von Badaboo

Badaboo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vielen Dank für eure Antworten.

Hatte die Suchfunktion eigentlich verwendet aber kam nicht auf die Idee nach Rundungsfehlern zu suchen als Stichwort :-)

Schöne Grüße
Badaboo
28.01.2019 10:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 10 Monate.
Der letzte Beitrag ist älter als 10 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 12.12.2019 01:34