Floating Point / Decimal Repräsentation
-
Ich habe eine Frage zu folgendem Codeabschnitt, wo ich nicht ganz verstehe wie ich diese Zahl richtig in floating point Form angebe:
public void SetYears() { years = (double) 4.294.967.296; }
Der Fehler den ich erhalte ist folgender:
error CS1525: Unexpected symbol `0.967' error CS1525: Unexpected symbol `0.296' error CS0201: Only assignment, call, increment, decrement, and new object expressions can be used as a statement
Years ist ebenfalls als double deklariert worden.
Kann mir jemand sagen, was ich falsch mache?Vielen Dank im Voraus
-
public void SetYears() { years = 4294967296.0; }
oder
public void SetYears() { years = 4294967296d; }
-
dot schrieb:
public void SetYears() { years = 4294967296.0; }
oder
public void SetYears() { years = 4294967296d; }
Danke, aber das hilft mir nicht
Ich möchte nämlich gerne die Kommas in der
Zahl beibehalten und es soll auch kein string sein, weil ich damit rechnen
möchte.Andere Vorschläge vielleicht?
-
wtf? Die Sprache C# folgt einer Syntax und diese Syntax kennt sowas wie "Kommas in der Zahl" (du meinst wohl Tausendertrennzeichen, wofür im anglikanischen Raum übrigens das Komma (,) verwendet wird und nicht der Punkt (.), da der Punkt bereits als Dezimaltrennzeichen verwendet wird) nicht. Wenn dir das nicht passt, musst du dir eine andere Sprache suchen.
-
dot schrieb:
wtf? Die Sprache C# folgt einer Syntax und diese Syntax kennt sowas wie "Kommas in der Zahl" (du meinst wohl Tausendertrennzeichen, wofür im anglikanischen Raum übrigens das Komma (,) verwendet wird und nicht der Punkt (.), da der Punkt bereits als Dezimaltrennzeichen verwendet wird) nicht. Wenn dir das nicht passt, musst du dir eine andere Sprache suchen.
Ich hatte ja ganz zu Anfang Kommas genutzt .... sobald ich Kommas nutze kommt die folgende Fehlermeldung
error CS1525: Unexpected symbol `,', expecting `;' error CS0201: Only assignment, call, increment, decrement, and new object
Deswegen frage ich hier ja auch
-
Weil das kein C# ist. Wenn du C# programmieren willst, musst du dich auch an die C# Syntax halten und die kennt kein Komma als Dezimaltrennzeichen, sondern nur den Punkt und kennt auch keine Tausendertrennzeichen. Ein double Literal in C# hat die Form
123456.78
und fertig. Du kannst noch eind
oderD
anhängen, um das Literal explizit als double auszuzeichnen, die Ziffern entweder vor oder nach dem . weglassen, wenn sie alle 0 wären bzw. falls du eind
oderD
den . auch, aber das wars.
-
dot schrieb:
Weil das kein C# ist. Wenn du C# programmieren willst, musst du dich auch an die C# Syntax halten und die kennt kein Komma als Dezimaltrennzeichen, sondern nur den Punkt und kennt auch keine Tausendertrennzeichen. Ein double Literal in C# hat die Form
123456.78
und fertig.Ok danke .... vielleicht erwarte ich zuviel von der Sprache .... auf jeden Fall danke für den Rat
-
Ich glaub aber, dass dein Problem eigentlich was anderes ist. Wenn du mit Zahlen rechnen willst, die der Benutzer eingibt, kannst du natürlich alle möglichen Formate verwenden, da kennt .NET das von dir gewünschte Format auch.
Aber wenn du Zahlen direkt in den Code schreiben willst, musst du dich natürlich an die Sprachsyntax halten. Und die erlaubt Konstrukte wie1234,5678,91011
nicht, da man da sehr schnell auf Probleme stößt. Denn was sollte z.B. der Ausdruck(1234,5678,91011)
darstellen? Eine Zahl? Eine Liste von Zahlen? Die Parameter eines Funktionsaufrufs? Je nach Situation macht jede Interpretation auf irgendeine Art und Weise Sinn. Und anstatt sich dann irgendwelche undurchschaubaren Regeln auszudenken, erlaubt man das einfach nicht, da die Sprache dadurch nur unnötig kompliziert würde. Stell dir mal vor du schreibst irgendwo sowas hin, im Glauben es ist eine Zahl, du hast aber irgendwas übersehen und der Compiler interpretiert es als Liste von Zahlen, nimmt daraus nur die erste und das ganze kompiliert einfach so. Das ist genau die Art von Bug, wo man stundenlang genau die eine Zeile Code anstarren kann, ohne auch nur einen blassen Schimmer zu haben, was genau daran falsch sein soll, weil du einfach nicht auf die Idee kommst, dass1234,5678,91011
aufgrund irgendwelche komplexer Mechanismen in der Sprache in konkreten Fall am Ende doch etwas anderes war, als das, was du dir gedacht hast, als du es geschrieben hast. Andere Sprachen wie z.B. C oder C++ machen genau solche Sachen, die Designer von C# haben sich vermutlich gedacht, dass sowas mehr schadet als nützt und es daher in C# nicht erlaubt...
-
dot schrieb:
Ich glaub aber, dass dein Problem eigentlich was anderes ist. Wenn du mit Zahlen rechnen willst, die der Benutzer eingibt, kannst du natürlich alle möglichen Formate verwenden, da kennt .NET das von dir gewünschte Format auch. Aber wenn du Zahlen direkt in den Code schreiben willst, musst du dich natürlich an die Sprachsyntax halten. Und die erlaubt Konstrukte wie
1234,5678,91011
nicht, da man da sehr schnell auf Probleme stößt. Denn was sollte z.B. der Ausdruck(1234,5678,91011)
darstellen? Eine Zahl? Eine Liste von Zahlen? Die Parameter eines Funktionsaufrufs?Ja gut ... es stimmt schon, es ist nicht deutlich genug (vor allem nicht für den Compiler), aber es müsste doch wenigstens möglich sein, sowas in nem Code anzugeben und das auf einem Bildschirm auszugeben .... aber ich halte mich jetzt an deinen Rat und vermeide solche Dinge.
-
Natürlich ist es möglich, sowas auf den Bildschirm auszugeben, schau dir z.B. mal an, was die Methode String.Format() so alles kann. Du kannst lediglich die Zahlen nicht einfach so in den Code schreiben, weil die Syntax es eben nicht erlaubt. Das hindert dich aber nicht daran, Benutzereingaben so zu interpretieren, wie du willst oder deine Ausgaben so zu formatieren, wie du willst. Das eine hat mit dem anderen ja überhaupt nix zu tun...
-
Du musst einfach unterscheiden zwischen den interpretierbaren Strings für den Typ float/double und der Darstellung z.B. in einer TextBox mit evtl. Formatierung nach Ländereinstellung und Tausendertrennzeichen. In beide Richtungen gibt es geeignete Methoden zur Konvertierung. Bei der Interpretation eines String nach float/double muss das Dezimalzeichen der Punkt und müssen die Tausendertrennzeichen eliminiert sein.
-
Da ich bei meinem Projekt auch an der Problematik dran war möchte ich ein paar Tipps dazu geben. Es ist nämlich so, dass WPF-Applikationen immer erstmal auf US/EN eingestellt sind. Das kann man leicht ändern indem man in den Konstruktor vom MainWindow das reinschreibt:
// Set Operating-System-Culture for this Application FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
Das bewirkt dass das Programm nach aussen hin das Komma als Dezimal-Separator benutzt. Also sowohl beim Import/Export von double als auch bei der Darstellung in Control-Elementen. Nur im Code selber benutzt man dann weiterhin den Punkt.
Auch praktisch ist, wenn man den aktuell verwendeten Separator ausliest:
string separator = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator;
Grüsse
Ank