Forum: PC-Programmierung float und double als z.B. 1.5 oder 1,5 ?


von Zahlenhansel (Gast)


Lesenswert?

War gerade überrascht beim rumspielen mit C# über das Ergebnis

Es sollen double Werte eingegeben werden

Anzahl der Zahlen eingeben um den Durchschnitt zu berechnen:

2

Erste Zahl:

1.5

Zweite Zahl:

3.5

Ergebnis: 25

lustig oder?

von entity (Gast)


Lesenswert?

',' ist das Dezimaltrennzeichen, wird von der dt. Landeinstellung 
übernommen.

Zu Überraschungen führt das übrigens oft beim Parsen von String auf 
de-und en-Windowsversionen mit double.parse(). Man erzwingt dann das 
Parsen mit Dezimalpunkt über
double.Parse("2.3", CultureInfo.InvariantCulture)

von Zahlenhansel (Gast)


Lesenswert?

Das Ergebnis hängt in der Tat von der Einstellung des Zahlenformats ab. 
Das Dezimaltrennzeichen steht bei Windows per default auf ','. Der 
Dezimalpunkt '.' trennt dann Dreierpakete wie 1.200. Ich habs mal 
probeweise umgestellt auf den Dezimalpunkt und siehe da, das Ergebnis 
stimmt jetzt mit 2.5.

Das heißt aber auch die Software muss unbedingt prüfen welches 
Zahlenformat eingetellt ist, sonst konvertiert die Funktion gnadenlos 
1.5 in 15 ohne eine Exeption auszulösen.

von Zahlenhansel (Gast)


Lesenswert?

Übrigens "CultureInfo" kennt mein C# Express nicht. Hab das anders 
gelöst. Konvertiert habe ich zuerst mit der Methode 
Convert.ToDouble(sVal) wobei sVal ein String ist. Gibt aber noch eine 
weitere überladene Methode, nämlich Convert.ToDouble(sVal, provider). 
provider ist ein Objekt vom Typ NumberFormatInfo, dem man mit der 
Eigenschaft NumberDecimalSeparator einen Dezimalpunkt zuweist. Dann 
verwendet die Funktion dies als Trennzeichen und nicht die Windows 
default Einstellung.

von Bartli (Gast)


Lesenswert?

> Übrigens "CultureInfo" kennt mein C# Express nicht.

Das glaube ich jetzt fast nicht.

CultureInfo befindet sich im Namespace System.Globalization.

von Zahlenhansel (Gast)


Lesenswert?

>> Übrigens "CultureInfo" kennt mein C# Express nicht.

> Das glaube ich jetzt fast nicht.

> CultureInfo befindet sich im Namespace System.Globalization.

Du hast recht, ich habs gerade noch mal laufen lassen. Die Hilfe hatte 
gestern nichts angezeigt, aber ich hab da schlicht was falsch 
geschrieben, was dann zum Fehler beim Erstellen der Projektmappe führte. 
Habs dann einfach auskommentiert und erst mal links liegen lassen .. Mit 
CultureInfo funktioniert das aber genauso, ich habs gerade im Debugger 
gesehen (kommt 1.5 und nicht 15 raus). Hab halt noch nicht viel mit .NET 
u. C# gemacht (genau genommen gar nix) und da bin ich schon froh, wenn 
was klappt. Ist nicht so einfach da nicht die Übersicht zu verlieren, 
ohne die IDE (die wirklich sehr gut ist) wäre ich glatt verloren. ;)

Die CultureInfo Lösung leuchtet mir allerdings noch nicht richtig ein 
bzw. deren Einfluss auf die Parse-Funktion. Da ist mir meine Lösung mit 
dem NumberFormatInfo-Objekt, wo der Seperator explizit vorgegeben wird 
plausibler. Aber egal, will mich nicht an diesem Beispiel festbeißen.

Danke auf jeden Fall erst mal euch beiden.

von Bartli (Gast)


Lesenswert?

Grob gesagt repräsentiert ein CultureInfo Objekt halt eine Locale mit 
Informationen wie z.B. Dezimalzahlen oder auch ein Datum in einer 
bestimmten Region dargestellt werden.

Für Dezimalzahlen enthält CultureInfo.InvariantCulture (vermutlich) 
bereits einen NumberFormatProvider welcher dasselbe macht wie dein von 
Hand konstruierter NumberFormatProvider.

Schaust du dir CultureInfo und NumberFormatProvider an so siehst du, 
dass beide IFormatProvider implementieren, und das zweite Argument 
double.Parse() ist ebenfalls vom Typ IFormatProvider.

Für deinen speziellen Anwendungsfall ist CultureInfo.InvariantCulture 
halt eine nette und häufig verwendete Abkürzung, da du dir nicht selber 
einen NumberFormatProvider bauen musst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.