Laden...

Double.Parse ergibt unterschiedliche Werte?

Erstellt von the_lmich vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.564 Views
the_lmich Themenstarter:in
248 Beiträge seit 2005
vor 16 Jahren
Double.Parse ergibt unterschiedliche Werte?

Tach zusammen,

ich finde dazu leider nix in der Suche, man verzeihe mir eine eventuelle Redundanz.

In zwei verschiedenen .NET-Anwendungen (gleiche Maschine, gleiches Framework) ergibt


double test = double.Parse("855,1");

bei einem Mal: test = 855.1 und bei der anderen Applikation test = 855.10000000000002

Es ist exakt der gleiche Ausdruck. Deklaration, Operation und Zuweisung in einer Zeile.

Ich begreifs nicht mehr ...

Help, anyone?
🙂 Torsten

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo the_lmich,

der Unterschied liegt darin, ob in den Ländereinstellungen Komma oder Punkt als Dezimaltrenner eingestellt ist.

Wenn du das vermeiden willst, verwende eine feste Kultur, am bessten InvariantCulture.

herbivore

the_lmich Themenstarter:in
248 Beiträge seit 2005
vor 16 Jahren

Hallo herbivore,

danke für die Antwort. Bei zu-String Formatierungen kenne ich das, aber bei zu-Double ist mir das neu. Wo gebe ich die Culture den an?

Gruß
🙂 Torsten

1.378 Beiträge seit 2006
vor 16 Jahren

@herbivore: Ich bin mir nicht sicher ob du das Problem richtig erkannt hast. Bei beiden Computern wird das Komma richtig gesetzt, nur bei einem wird komischerweise falsch gerundet oder so.

Wir haben genau das selbe Problem seit längerem in der Firma.

Wenn Microsoft Visual SourceSafe 2005 installiert ist, runden alle Programme die unter SourceControl stehen falsch. Das heißt es passiert genau das selbe wie bei deinem Beispiel. Wird aber SourceSafe deinstalliert, funktioniert wieder alles richtig.

Auch ist mir das Verhalten beim Microsoft Sql Management Studio aufgefallen, das beim Eintragen bestimmter Werte immer falsch gerundet wird, wobei beim Sql Enterprise Manager dieser Fehler nicht auftritt.

Sehr kurios wir haben das so gelöst, das wir nirgends in der Applikation mehr float/double verwenden sondern nur mehr decimal weil dort der Fehler nicht aufgetreten ist.

Habe damals im Internet auch nichts vergleichbares dazu gefunden.

Lg XXX

the_lmich Themenstarter:in
248 Beiträge seit 2005
vor 16 Jahren

Hi xxxprod,

danke für Deine Antwort. DAS genau ist der Unterschied zwischen den beiden Applikationen. Wie bei Euch.

Das ist ja unglaublich!

Vielen Dank
🙂 Torsten

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo the_lmich,

Wo gebe ich die Culture den an?

wenn es gewesen wäre, was ich fälschlich vermutet habe, dann würdest du die Culture bei double.Parse angeben. Von double.Parse gibt es mehr als eine Überladung.

herbivore

the_lmich Themenstarter:in
248 Beiträge seit 2005
vor 16 Jahren

Hallo herbivore,

okay - danke dennoch.

Grüße
🙂 Torsten

T
13 Beiträge seit 2006
vor 16 Jahren

Hallo,

gleiches Problem - ähnliche Baustelle:

In einem größeren Projekt (dass auch unter SourceCode Verwaltung steht), liefern folgende Zeilen krumme Werte. Ausgangspunkt ist natürlich ein anderer, aber das nur am Rande.


decimal deci = 123.45678m;
double dRes = Convert.ToDouble(deci);
dRes = Math.Round(dRes, 3);

Nun habe ich die selben Zeilen in einem kleinen Testprojekt gegengecheckt -> da geht es.
Das Testprojekt auch in SourceSafe eingecheckt -> geht trotzdem noch!

So, nun die Fragen: Ist das einfach nur ein Bug, der in großen Projekten gerne mal auftritt oder kann das auch irgendwas mit irgendwo gesetzten Umgebungsvariablen (/Culture Einstellungen?) für Genauigkeit etc. pp zu tun haben?
Und was zum Geier kann man dagegen tun wenn alle bisher gefundenen und selbst entwickelten Workarounds absolut keinen Effekt haben, man aber aufgrund Datenmodell und diverser Berechnungen auf 'double' angewiesen ist?

Verzweifelte Grüße
Thunder

849 Beiträge seit 2006
vor 16 Jahren

Wenn SOurceSafe solche Problem bringt.. solltet ihr vielleicht auf andere Programme wie CVS oder SVN umsteigen.

T
13 Beiträge seit 2006
vor 16 Jahren

Original von Thunderhawk
Nun habe ich die selben Zeilen in einem kleinen Testprojekt gegengecheckt -> da geht es.
Das Testprojekt auch in SourceSafe eingecheckt -> geht trotzdem noch!

An SourceSafe liegt es ja wohl nicht - oder nicht nur...

Noch irgendwelche Ideen oder Anregungen, wie man das Problem umgehen oder diesem auf den Grund gehen könnte? Ist ja doch äusserst kurios, dass double abhängig vom Projektkontext mal funktioniert (so genau das bei diesem Datentyp geht) und mal nicht.