Forum: PC-Programmierung Potenzieren in csharp


von Math (Gast)


Lesenswert?

Funktion Potenzieren in Csharp nur über die math.pow Methode?

: Verschoben durch Moderator
von Stefan F. (Gast)


Lesenswert?

Math schrieb:
> Funktion Potenzieren in Csharp nur über die math.pow Methode?

Erlaube mir die Gegenfrage: Warum sollte es mehrere Alternativen in der 
Programmiersprache geben?

Abgesehen davon ist es in den beiden Vorgängern C und Java prinzipiell 
nicht anders. Die Syntax stellt nur grundlegende Operationen bereit. 
Komplexe Berechnungen sind Sache von Funktionen/Methoden.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Als Java-Verschnitt hat C# so etwas nicht. Du bist aber bei weitem nicht
der erste, der diese Frage stellt. Eine einfache Google-Suche hätte dich
auf diese und viele weitere Seiten mit der Antwort geführt:

  https://stackoverflow.com/questions/3034604/is-there-an-exponent-operator-in-c

von Felix U. (ubfx)


Lesenswert?

Stefan ⛄ F. schrieb:
> Erlaube mir die Gegenfrage: Warum sollte es mehrere Alternativen in der
> Programmiersprache geben?

In Python gibt es zum Beispiel einen überladbaren Potenzoperator und das 
klassische Math.pow. Die Frage ist also nicht abwegig (auch wenn google 
wohl schneller gewesen wäre).

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

Stefan ⛄ F. schrieb:
> Erlaube mir die Gegenfrage: Warum sollte es mehrere Alternativen in der
> Programmiersprache geben?

Eine reicht, wenn sie generisch ist. Math.Pow rechnet aber fest mit
double und ist deswegen nur eingeschränkt auf long und ulong anwendbar.
Die Operatoren +, -, * und / hingegen sind generisch und funktionieren
deswegen ohne Einschränkungen sowohl mit double als auch mit long. Gäbe
es einen Potenzoperator ähnlich dem ** in anderen Programmiersprachen,
wäre dieser sicher ebenfalls generisch.

Da C# drei Generationen jünger als sein Urgroßvater C ist, sollte man
eigentlich meinen, dass solche Schwächen mittlerweile ausgemerzt sein
sollten. Das sind sie aber nicht.

Ein anderes Beispiel für die unreflektierte Übernahme von Altlasten ist
die verkehrte Vorrangreihenfolge der Vergleichs- und der bitweisen UND-
und ODER-Operatoren.

C# ist halt im Wesentlichen eine Copy-Paste-Sprache, bei der einfach nur
bestehende Sprachkonzepte und -elemente 1:1 zusammenkopiert wurden, ohne
sich Gedanken darüber zu machen, welche davon einer Überarbeitung
bedürfen.

von Math (Gast)


Lesenswert?

Yalu X. schrieb:
> Math.Pow rechnet aber fest mit
> double
und das ist mein Problem. brauche das Ergebnis als float, um es auf 9 
Nachkommastellen begrenzt zu haben

von Stefan F. (Gast)


Lesenswert?

Ganz so unreflektiert finde ich das nicht. Die Math Bilbiothek könnte 
problemlos auch eine pow() Funktion für Integer bereit stellen. Nur 
braucht man das sehr selten und würde zudem sehr schnell den möglichen 
Zahlenbereich  überschreiten.

x^2 braucht man oft, dafür schreibt man einfach x*x.
x^3 ersetzt man durch x*x*x.
und so weiter, danach wird es aber schon exotisch.

Doch wenn du x^1.5 rechnen willst, brauchst du bereit die Fließkomma 
Algorithmen.

von Felix U. (ubfx)


Lesenswert?

Stefan ⛄ F. schrieb:
> Doch wenn du x^1.5 rechnen willst, brauchst du bereit die Fließkomma
> Algorithmen.

Was wenn du eine fixed point oder Matrix-Klasse implementiert hast und 
die potenzieren willst?

von Math (Gast)


Lesenswert?

Math schrieb:
> und das ist mein Problem. brauche das Ergebnis als float, um es auf 9
> Nachkommastellen begrenzt zu haben

dann muss etwas her wie convert.tosingle

von Stefan F. (Gast)


Lesenswert?

Felix U. schrieb:
> Was wenn du eine fixed point oder Matrix-Klasse implementiert hast und
> die potenzieren willst?

Dann implementierst du den passenden Algorithmus und alle sind 
glücklich.

von Felix U. (ubfx)


Lesenswert?

Stefan ⛄ F. schrieb:
> Dann implementierst du den passenden Algorithmus und alle sind
> glücklich.

Da wäre es doch schön wenn man ein für eine allgemeine Operation wie 
das Potenzieren auch einen Operator hätte, den man entsprechend 
überladen kann.

: Bearbeitet durch User
von Math (Gast)


Lesenswert?

kann ich einen gleitkommatypen auf genau drei nachkommastellen 
reduzieren?

von Stefan F. (Gast)


Lesenswert?

Felix U. schrieb:
> Da wäre es doch schön wenn man ein für eine allgemeine Operation wie
> das Potenzieren auch einen Operator hätte, den man entsprechend
> überladen kann.

Ja schon. Nur diskutiert dann jeder darüber, welche Operation noch dazu 
zählen soll. Was ist mit der Wurzel? Oder Währungen? Wenn ich eine 
Programmiersprache gestalten würde, dann würde ich dieses Wunschkonzert 
bewusst ausschließen, weil das ein Fass ohne Boden ist.

von Stefan F. (Gast)


Lesenswert?

Math schrieb:
> kann ich einen gleitkommatypen auf genau drei nachkommastellen
> reduzieren?

Davon gehe ich doch mal stark aus - kenne C# allerdings nicht.

Ich benutze dazu üblicherweise Datentypen mit einstellbarer Genauigkeit 
und passend zur Anwendung einstellbaren Rundungsregeln: BigDecimal

Warum C+ nur BigInteger kennt, ist mit ein Rätsel. Selbst Datenbanken 
haben BigDecimal.

Aber was fehlt kann man hinzufügen, haben andere schon gemacht: 
https://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d

von Felix U. (ubfx)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ja schon. Nur diskutiert dann jeder darüber, welche Operation noch dazu
> zählen soll. Was ist mit der Wurzel? Oder Währungen?

Die Wurzel ist ja nur eine Potenz, das fiele also schon mal weg. 
Währungen oder Einheiten sind eine lineare Skalierung und deshalb schon 
darstellbar. Es ist ja nicht so, als müsste man hier ganz neue Theorien 
entwickeln, wir können uns an der Mathematik orientieren.

von Math (Gast)


Angehängte Dateien:

Lesenswert?

genau 3

von Math (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Aber was fehlt kann man hinzufügen, haben andere schon gemacht:
> https://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d

das werde ich nicht in mein pr0gramm klatschen

von Math (Gast)


Lesenswert?

wqas ist mit einem rechtsshift?

von Stefan F. (Gast)


Lesenswert?

Felix U. schrieb:
> Die Wurzel ist ja nur eine Potenz, das fiele also schon mal weg.

Nicht bei Integer, wonach gefragt wurde.

von Stefan F. (Gast)


Lesenswert?


von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Math schrieb:
> kann ich einen gleitkommatypen auf genau drei nachkommastellen
> reduzieren?

Math.Round existiert auch in C#.

von c-hater (Gast)


Lesenswert?

Felix U. schrieb:

> Was wenn du eine fixed point oder Matrix-Klasse implementiert hast und
> die potenzieren willst?

Dann schreibst du dir einfach deine eigenen Operatoren dafür. Was denn 
sonst?

von c-hater (Gast)


Lesenswert?

Math schrieb:

> kann ich einen gleitkommatypen auf genau drei nachkommastellen
> reduzieren?

Du meinst sicher eigentlich: dezimale Nachkommastellen. Und dann ist 
die Antwort natürlich: garnicht, jedenfalls für die "normalen" 
Gleitkommatypen.

Ausnahme ist Decimal, denn das wurde extra dafür geschaffen, mit 
Dezimalkram umzugehen.

Was nun die normalen Floats betrifft: einfach nur für die Ausgabe 
entsprechend runden. An vielen Stellen gibt es schon passende 
Vorrichtungen dafür, die aber alle letztlich auf die passenden 
Überladungen der ToString-Methode zurückgreifen, nämlich auf die, die 
einen Formatstring akzeptieren.

von Zeno (Gast)


Lesenswert?

Yalu X. schrieb:
> C# ist halt im Wesentlichen eine Copy-Paste-Sprache, bei der einfach nur
> bestehende Sprachkonzepte und -elemente 1:1 zusammenkopiert wurden, ohne
> sich Gedanken darüber zu machen, welche davon einer Überarbeitung
> bedürfen.

So ist es. Mußte mal eine Weile mit C# beruflich arbeiten. Es gibt zwar 
eine Menge Dinge die nicht schlecht gelöst sind, aber man war nicht 
konsequent bis zum Schluß.
Z.B. die Einführung der Nullable-Wertetypen ist keine schlechte Sache, 
da man so einfach herausfinden kann ob eine Variable mit Werten belegt 
wurde oder nicht. Man muß also die Variable nicht mehr mit irgend einem 
Wert initialisieren, von dem man hofft das er niemals in dem zu 
erwartenden Wertebereich auftritt. Aber an Stelle alle Variable als 
Nullable zu deklarieren hat einen zusätzlichen Datentyp eingeführt. 
Beispiel:
int a; ist nicht nullable
int? a; ist nullable
In den normalen Algorithmen verhalten sich nullable Variable genauso wie 
die normalen. Bei nullable kann ich halt nur zusätzlich die Abfrage 
a==NULL machen bzw. die Variable auf NULL setzen. Hätte man generell 
einführen können hat man aber nicht.

Ebenso hat man versucht das (nach meinem Empfinden) unsägliche 
Headerkonzept von C durch das sehr gute Unit-Konzept von Pascal/Delphi 
zu ersetzen, was ja auch nicht verwunderlich da ja der Chefentwickler 
von C# Herr Heljsberg früher bei Borland war und als Erfinder von 
Turbopascal und Delphi gilt. Leider funktioniert das ganze nicht so gut 
wie in Delphi.

Die Compilierung der Programme zur Laufzeit und der unsägliche Overhead 
des .NET Frameworks macht das ganze so unsäglich träge und die Programme 
um ein vielfaches größer. Jede native Exe ist deutlich schneller.

Man hätte hier wirklich die Chance gehabt das Gute aus der C und 
Pascalwelt zusammen zu führen und eine gute Programmiersprache zu machen 
die das gute aus beiden Welten vereint. Aber man hat es wieder einmal 
vergeigt, indem man die Altlasten wieder mit geschleppt hat und und gute 
(neue) Ansätze nicht konsequent bis zum Ende geführt hat.

von Math (Gast)


Lesenswert?

also muss erst double in decimal ändern. und decimal die 
nachkommastellen abschneiden

von Yalu X. (yalu) (Moderator)


Lesenswert?

Math schrieb:
> brauche das Ergebnis als float, um es auf 9
> Nachkommastellen begrenzt zu haben

Die Genauigkeit zu reduzieren, ist doch nie ein Problem. Im konkreten
Fall kannst du das Ergebnis nach float casten oder (wenn es exakt 9
Nachkommastellen sein sollen) mit Math.Round auf die gewünschte
Stellenzahl runden.

Aber wozu will man das, außer bei der Ausgabe? Und für die Ausgabe gibt
es bessere Möglichkeiten, die Anzahl der angezeigten Nachkommastellen
festzulegen.

Stefan ⛄ F. schrieb:
> Ganz so unreflektiert finde ich das nicht. Die Math Bilbiothek könnte
> problemlos auch eine pow() Funktion für Integer bereit stellen. Nur
> braucht man das sehr selten

Es geht nicht nur um die Generizität, sondern auch darum, dass das
Aussehen einer Formel in einem Programm möglichst der mathematischen
Schreibweise entsprechen sollte. Wegen der Eindimensionalität der
Programmiersprachensyntax ist das nicht vollständig möglich (man kann
bspw. auch keine Brüche mit übereinanderstehendem Zähler und Nenner
schreiben), aber a^b oder a**b sieht schon sehr viel übersichtlicher aus
als Math.Pow(a, b).

Aus diesem Grund verwendet man ja auch +, -, * und / und nicht etwa
Math.Add(), Math.Multiply(), Math.Subtract() und Math.Divide().

Was die Generizität betrifft: Ganzzahlige Exponenten habe ich sehr oft.
Wenn ich immer sicher wäre, dass dabei die pow-Funktion die Potenz nicht
über Logarithmus und Exponentiation, sondern über die jeweils minimale
Anzahl von Multiplikationen berechnet, wäre das ok. Aber da müsste ich
jeweils tiefer in die Implementation der Funktion schauen.

> x^2 braucht man oft, dafür schreibt man einfach x*x.
> x^3 ersetzt man durch x*x*x.

Und wie sieht es bei (2*a+3*b+4)**3 aus? Temporäre Variablen, die nur
dem Zweck dienen, Einschränkungen der Programmiersprache auszubügeln,
verwende ich ungern.

> Doch wenn du x^1.5 rechnen willst, brauchst du bereit die Fließkomma
> Algorithmen.

Für die sehr seltenen Fälle, wo man gebrochene Exponenten ungleich 0.5
braucht, akzeptiere ich auch die pow-Funktion trotz ihres hässlichen
Aussehens :)

von Math (Gast)


Lesenswert?

Yalu X. schrieb:
> Aber wozu will man das, außer bei der Ausgabe?

um ein Messgerät zu parametrisieren. soll die Amplitude werden

von Math (Gast)


Lesenswert?

Math schrieb:
> decimal die
> nachkommastellen abschneiden

mittels

Yalu X. schrieb:
> Math.Round

funktioniert jetzt alles.

von c-hater (Gast)


Lesenswert?

Yalu X. schrieb:

> aber a^b oder a**b sieht schon sehr viel übersichtlicher aus
> als Math.Pow(a, b).

Wieder dieser C/C++-Scheuklappenblick, den ich so zum Kotzen finde. 
Nein, das ist NICHT übersichtlicher. Es hat nämlich mit der 
mathematischen Notation ebenfalls rein garnix zu tun. Sprich: ist nur 
für Leute auflösbar, die diese Sprachen können.

> Aus diesem Grund verwendet man ja auch +, -, * und / und nicht etwa
> Math.Add(), Math.Multiply(), Math.Subtract() und Math.Divide().

Ja, diese Operatoren entsprechen ja auch der mathematischen Notation 
derselben Sache. Naja, bis auf das Asterisk, was die Sache nicht ganz 
trifft...

Und übrigens: das "Math." an jeder einzelnen Stelle ist überflüssig. Man 
muss halt einmal am Anfang der Datei Math "usen" und der Drops ist 
gelutscht.

von Math (Gast)


Angehängte Dateien:

Lesenswert?

könnt ihr mir helfen?

von Math (Gast)


Lesenswert?

Math schrieb:
> könnt ihr mir helfen?

warum wird das in der TextBox so hässlich angegeben

von Math (Gast)


Lesenswert?

Math schrieb:
> warum wird das in der TextBox so hässlich angegeben

das Problem tritt nur auf, wenn ich eine Dezimalzahl in die TextBox 
links eingebe. Bei natürliche Zahlen wird die Umrechnung korrekt auf 
drei nachkommastellen angegeben

von Stefan F. (Gast)


Lesenswert?

Ich sehe da nichts hässliches, außer deinen Formfehler:

Quelltexte und Fehlermeldungen postet man als Text, nicht als Bild.

Schaltpläne postet man als Bild, nicht als Text (Prosa).


Ist das so schwer? Oder bin ich zu alt?

von c-hater (Gast)


Lesenswert?

Math schrieb:

> könnt ihr mir helfen?

Du arbeitest offensichtlich mit deutschen Locales. Und in der deutschen 
Kultur dient halt "." nicht als Dezimaltrenner. Sprich: gib einfach 
"3,22" statt "3.22" ein ud alles ist schick.

von S. R. (svenska)


Lesenswert?

Yalu X. schrieb:
> Aus diesem Grund verwendet man ja auch +, -, * und / und nicht etwa
> Math.Add(), Math.Multiply(), Math.Subtract() und Math.Divide().

Naja, und wenn den Multiplikationsoperator irgendwann auf Vektoren und 
Matritzen ausweiten möchte, wird es sehr schnell sehr hässlich.

Ich finde da infix-Funktionen irgendwie ganz nett, aber vermutlich führt 
das auch zu ekligen Konsequenzen. :-(

Math schrieb:
> könnt ihr mir helfen?

Ich würde da einfach mit Ganzzahlen arbeiten.
Drei Nachkommastellen -> multipliziere den Kram mit 1000.
Sechs Nachkommastellen -> multipliziere den Kram mit 1000000.

Das ganze in einen Ganzzahltyp wandeln (also Nachkommaanteil 
abschneiden) und für die Ausgabe wieder zurückteilen. Intern wird nur 
mit der Ganzzahl weitergearbeitet.

von Math (Gast)


Lesenswert?

c-hater schrieb:
> Du arbeitest offensichtlich mit deutschen Locales. Und in der deutschen
> Kultur dient halt "." nicht als Dezimaltrenner. Sprich: gib einfach
> "3,22" statt "3.22" ein ud alles ist schick.

Ja das hilft. Weiteres Problem: durch convert to string wird "," genutzt 
und nicht ".". Das Messgerät will aber "."

von Math (Gast)


Lesenswert?

Math schrieb:
> Ja das hilft. Weiteres Problem: durch convert to string wird "," genutzt
> und nicht ".". Das Messgerät will aber "."

liegt es daran, dass ich dezimal nutze? Ich muss es ja nutzen, um die 
Rundung machen zu können

von Felix U. (ubfx)


Lesenswert?

Math schrieb:
> liegt es daran, dass ich dezimal nutze? Ich muss es ja nutzen, um die
> Rundung machen zu können

Nein musst du nicht, du kannst auch einen float oder double runden.

https://docs.microsoft.com/de-de/dotnet/api/system.math.round?view=netcore-3.1#System_Math_Round_System_Double_System_Int32_System_MidpointRounding_

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Math schrieb:

> Ja das hilft. Weiteres Problem: durch convert to string wird "," genutzt
> und nicht ".". Das Messgerät will aber "."

Wenn die deutschen Locales nicht für deine Anwendung passen, musst du 
halt andere nehmen, die besser passen.

Da du die mehrfach benutzt, wäre es sinnvoll, die nur einmal für die 
Klasse zu beschaffen. Geht ungefähr so:

private NumberFormatInfo nfi=new 
Globalization.CultureInfo("en-US").NumberFormat;

Um dies verwenden zu können, mußt du von der Unsitte ablassen, für allen 
Scheiß Convert zu verwenden. Statt dessen die lokalisierbaren 
Typmethoden für die Konvertierung von/zu String verwenden. Deine Zeile 
sieht dann ungefähr so aus (unter der Bedingung, dass du das von oben 
getan hast, also die NumberFormatInfo in nfi zur Verfügung steht):

txtNSpannung.Text = Dezimal.Parse(txtSpannung.Text, 
NumberStyles.AllowDecimalPoint, nfi).ToString("0.000", nfi);

Dann hast du Ein- und Ausgabe mit US-Locales.

von c-hater (Gast)


Lesenswert?

Felix U. schrieb:

> Nein musst du nicht, du kannst auch einen float oder double runden.

Aber nicht auf exakt drei Dezimalstellen...

von Math (Gast)


Lesenswert?

1
   txtNSpannung.Text = Convert.ToString(Math.Round(Convert.ToDecimal(txtSpannung.Text) * Potenzieren, 3));


hier wird ein String mit "," ausgegeben. Aber warum?

von Math (Gast)


Lesenswert?

Math schrieb:
> hier wird ein String mit "," ausgegeben. Aber warum?

Konvertiert den Wert der angegebenen Dezimalzahl unter Verwendung der 
angegebenen kulturspezifischen Formatierungsinformationen in die 
entsprechende Zeichenfolgendarstellung.

von S. R. (svenska)


Lesenswert?

Math schrieb:
> Aber warum?

Weil dein Windows auf deutsch eingestellt ist, und da enthalten 
Kommzahlen nunmal ein Komma.

von InvariantCulture (Gast)


Lesenswert?

Convert.ToString(number, 
System.Globalization.CultureInfo.InvariantCulture)

von Math (Gast)


Lesenswert?

ist hässlich aber funktioniert
•
1
 txtNSpannung.Text = Convert.ToString(Math.Round(Convert.ToDecimal(txtSpannung.Text) * Potenzieren, 3), System.Globalization.CultureInfo.InvariantCulture);

von InvariantCulture (Gast)


Lesenswert?

Achtung, beim Parsen wird jetzt aber immer noch die lokale Kultur 
(wahrscheinlich DE?) verwendet! Bei ToDecimal kann auch die invariante 
Kultur angegeben werden.

Wenn es hässlich ist, einfach in mehrere Zeilen aufteilen und using 
verwenden.

von Math (Gast)


Lesenswert?

InvariantCulture schrieb:
> Achtung, beim Parsen wird jetzt aber immer noch die lokale Kultur
> (wahrscheinlich DE?) verwendet

hab ich geprüft, wird nicht.

von Jedzia D. (Firma: Rast und Ruh) (jedzia)


Lesenswert?

c-hater schrieb:
> Und übrigens: das "Math." an jeder einzelnen Stelle ist überflüssig. Man
> muss halt einmal am Anfang der Datei Math "usen" und der Drops ist
> gelutscht.

Dies bedarf wohl eins deiner fett unterlegten Worte.
Math.Pow ist eine statische Methode. Es gehört zum guten Umgang 
zwischen C# Entwicklern den Namensraum explizit anzugeben. Das erhöht 
die Lesbarkeit und reduziert "Verschmutzung" durch globale Importe von 
namespaces. Kann man machen, muss man nicht...

Um zur Verwirrung beizutragen gibt es übrigens auch noch
1
messErgebnis.ToString("0.00"); //2 dezimalstellen
2
3
messErgebnis.ToString("n2", System.Globalization.CultureInfo.InvariantCulture); // 2 dezimalstellen, kulturbezogene Trennzeichen
wenn das Hauptaugenmerk auf der Präsentation liegt.
siehe 
https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings

> xx is an optional integer called the precision specifier. The precision 
specifier ranges from 0 to 99 and affects the number of digits in the result. Note 
that the precision specifier controls the number of digits in the string 
representation of a number. It does not round the number itself. To perform a 
rounding operation, use the Math.Ceiling, Math.Floor, or Math.Round method.

siehe MidpointRounding.AwayFromZero und MidpointRounding.ToEven bei z.B. 
https://docs.microsoft.com/en-us/dotnet/api/system.midpointrounding?view=netcore-3.1#System_MidpointRounding_AwayFromZero

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

Math schrieb:
> Yalu X. schrieb:
>> Aber wozu will man das, außer bei der Ausgabe?
>
> um ein Messgerät zu parametrisieren.

Und wie übergibst du die Zahl dem Messgerät? Doch sicher als String über
irgendeine Schnittstelle. Also rechnest du mit der gerundeten Zahl nicht
weiter, sondern möchtest sie nur ausgeben.

Um eine Zahl auszugeben, rundet man sie nicht numerisch, sondern
übergibt der Routine, die die Zahl in einen String konvertiert,
entsprechende Formatierungsparameter:

1
using System.Globalization;
2
  // ...
3
  value = 12345.6789012;
4
  string s = string.Format(CultureInfo.InvariantCulture, "{0:f3}", value);
5
  // -> s = "12345.679"
6
  schickeStringZumMessgeraet(s);

Damit entfällt auch der Umweg über Decimal.

Edit:

Jedzia war schneller und hat sogar eine etwas weniger hässliche Lösung
gefunden.

: Bearbeitet durch Moderator
von c-hater (Gast)


Lesenswert?

Jedzia D. schrieb:

> Math.Pow ist eine statische Methode.

Ja klar.

> Es gehört zum guten Umgang
> zwischen C# Entwicklern den Namensraum explizit anzugeben.

Nur ist Math halt keine Namensraum, sondern eben eine Klasse...

Und zwar eine so grundlegende (weil direkt im Namensraum System 
gelegen), dass man in mathematiklastigen Klassen üblicherweise darauf 
verzichtet, jedes einzelne Vorkommen von Methoden daraus voll zu 
qualifizieren. Volle Qualifizierung würde übrigens auch bedeuten, dass 
man jedesmal:

System.Math.irgendwas schreiben müßte.

Das ist Bullshit. Das macht kein Mensch. Außer dir vielleicht...

von Jedzia D. (Firma: Rast und Ruh) (jedzia)


Lesenswert?

Huch @yalu.
Ich war einen Sekundenbruchteil schneller.
Wir sollten unbedingt noch alle 35 anderen Möglichkeiten(Hypothetische 
Zahl,  ist großzügig gerundet) dieses Problem zu lösen auflisten:)
Gilt dann: "Viele Köche verderben den Brei" ?

von Jedzia D. (Firma: Rast und Ruh) (jedzia)


Lesenswert?

Jaja c-hater. Außer mir nur noch Microsoft in ihren Beispielen.
Der war gut:)

: Bearbeitet durch User
von Math (Gast)


Lesenswert?

Yalu X. schrieb:
> rundet man sie nicht numerisch, sondern
> übergibt der Routine, die die Zahl in einen String konvertiert,
> entsprechende Formatierungsparameter:

gibt es einen konkreten Vorteil?

von Math (Gast)


Lesenswert?

vielen Dank übrigens für den Hinweis

von Math (Gast)


Lesenswert?

Frank M. schrieb:
> Math.Round existiert auch in C#.

math.round war schließlich der Vorschlag von Frank

von Math (Gast)


Lesenswert?

wenn ich den Spieß umdrehe, d.h. ich bekomme einen String mit ".", dann 
würde man es so machen? (vorausgesetzt, mehr als 3 nachkommastellen)
1
            string ÜbergabeSpannung = String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:f3}",GlobaleVariablen.Spannung);
2
            string ÜbergabePulsbreite = String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:f3}", GlobaleVariablen.Pulsbreite); ;
3
            // weist den Textboxen die aktuellen Parameter der Messgeräte zu
4
            txtSpannung.Text = ÜbergabeSpannung;
5
            txtPulsbreite.Text = ÜbergabePulsbreite;

von c-hater (Gast)


Lesenswert?

Math schrieb:
> wenn ich den Spieß umdrehe, d.h. ich bekomme einen String mit ".", dann
> würde man es so machen? (vorausgesetzt, mehr als 3 nachkommastellen)

Einfach so, wie ich es vorgeschlagen habe. Offensichtlich der Einzige 
der bisherigen Threadteilnehmer, der hier wirklich Ahnung vom 
Dotnet-Framework hat.

Naja, ein Tippfehler wäre noch zu korrigieren, "Decimal" statt 
"Dezimal".

Oder auch gleich Decimal durch double ersetzen, denn wie inzwischen 
rausgearbeitet wurde, hast du ja garnicht vor, mit dem Wert weiter zu 
rechnen (was ich sofort vermutet hatte), sondern willst ihn nur 
ausgeben.

Double kennt alle von mir verwendeten Methoden-Overloads ebenfalls und 
wird tun, was du willst.

von Math (Gast)


Lesenswert?

c-hater schrieb:
> Double kennt alle von mir verwendeten Methoden-Overloads ebenfalls und
> wird tun, was du willst.

math.round geht damit nicht

von c-hater (Gast)


Lesenswert?

Math schrieb:
> c-hater schrieb:
>> Double kennt alle von mir verwendeten Methoden-Overloads ebenfalls und
>> wird tun, was du willst.
>
> math.round geht damit nicht

Brauchst du auch nicht. Das wird bei der Ausgabe durch den Formatstring 
erledigt. Und es ist halt nur die Ausgabe relevant.

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

> Math schrieb:

>> math.round geht damit nicht

Das ist doch Bullshit. Math.Round geht sogar nur mit double. Brauchst 
du  aber hier garnicht. Das wird bei der Ausgabe durch den Formatstring 
erledigt. Und es ist halt nur die Ausgabe relevant.

Du weißt nichtmal näherungsweise, was du eigentlich tust, richtig?

von Felix U. (ubfx)


Lesenswert?

c-hater schrieb:
> Das ist doch Bullshit. Math.Round geht sogar nur mit double.

Das sieht zumindest die Microsoft Doku anders. Scheinbar haben die auch 
nicht so viel Ahnung von ihrem Framework wie du

von Math (Gast)


Lesenswert?

c-hater schrieb:
> Brauchst du auch nicht. Das wird bei der Ausgabe durch den Formatstring
> erledigt. Und es ist halt nur die Ausgabe relevant.

verstanden. trzd kurz die Frage,warum hier das komme aus txt nicht zum 
Punkt wird (nach der Zuweisung hat die Variable ein Komma)
   GlobaleVariablen.Pulsbreite = string.Format( 
txtPulsbreite.Text,CultureInfo.InvariantCulture);

von c-hater (Gast)


Lesenswert?

Felix U. schrieb:

> Das sieht zumindest die Microsoft Doku anders. Scheinbar haben die auch
> nicht so viel Ahnung von ihrem Framework wie du

Ja, OK. In .net-core geht inzischen auch was für decimal.

Waynes interessiert:

https://docs.microsoft.com/de-de/dotnetapi/system.math.round?view=netcore-3.1

von Math (Gast)


Lesenswert?

Math schrieb:
> trzd kurz die Frage,warum hier das komme aus txt nicht zum
> Punkt wird (nach der Zuweisung hat die Variable ein Komma)
>    GlobaleVariablen.Pulsbreite = string.Format(
> txtPulsbreite.Text,CultureInfo.InvariantCulture);

hat jemand eine Ahnung?

von c-hater (Gast)


Lesenswert?

Math schrieb:

> hat jemand eine Ahnung?

Ja, meine KI. Die ist inzwischen bei 99.99% Trollwahrscheinlichkeit 
angekommen (d.h.: semantisch ist die echt TOP!). Ich selber mit meiner 
einzig verfügbaren NI hänge noch bei ca. 99% rum, d.h.: es besteht noch 
ein gewisser Restzweifel, es am Ende doch mit einem völligen Nixwisser 
zu tun zu haben.

Wie auch immer: Tschüß, ich kann und werde nichts mehr für dich tun. 
Egal ob Troll oder tatsächlich Vollidiot...

von Math (Gast)


Lesenswert?

danke für die Nettigkeit

von Math (Gast)


Lesenswert?

ich bin wirklich müde. sitze den Tag an verschiedenen Programmen. Mag 
sein, dass die Frage nicht helle ist.

von Felix U. (ubfx)


Lesenswert?

Du musst uns mal nen größeren Screenshot von deinem Programm zeigen 
damit wir wissen dass es echt ist

von Math (Gast)


Lesenswert?

Felix U. schrieb:
> damit wir wissen dass es echt ist

meine Dummheit?

von c-hater (Gast)


Lesenswert?

Math schrieb:

> ich bin wirklich müde. sitze den Tag an verschiedenen Programmen. Mag
> sein, dass die Frage nicht helle ist.

Wieder eine Dezimalstelle bei der KI-Bewertung genommen. Nunmehr 99.99% 
pro Troll...

von Math (Gast)


Angehängte Dateien:

Lesenswert?

anbei der auszug

von Math (Gast)


Lesenswert?

Felix U. schrieb:
> Du musst uns mal nen größeren Screenshot von deinem Programm zeigen
> damit wir wissen dass es echt ist

fällt schwer hier offen und ehrlich zu sein, wenn viele über einen 
herziehen

von Jedzia D. (Firma: Rast und Ruh) (jedzia)


Lesenswert?

CultureInfo.InvariantCulture definiert die Formatierung als die vom User 
unabhängig gewählte Variante.
Ich nehme an, du willst von der Software an dein Messgerät etwas 
ausgeben. Deswegen sollte die Software des Messgerätes ebenfalls die 
invariante Version benutzen.
Was Du hier suchst ist CultureInfo.InstalledUICulture, 
CultureInfo("en-GB") oder CultureInfo("de-DE"). Bei Ersterem, was die 
Grundeinstellung ist kann es dazu kommen, dass bei einem amerikanischen 
Nutzer dein Programm nicht funktioniert. Das Bedarf einer Prüfung und Du 
solltest dich in das Thema einlesen und darüber nachdenken.

https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/4c5zdc6a(v=vs.100)
http://geekswithblogs.net/kobush/archive/2007/09/16/avoidcommonglobalizationerrors.aspx
https://stackoverflow.com/questions/2583362/how-to-convert-string-to-double-with-proper-cultureinfo

c-hater: Du kannst doch nicht einfach gehen. Ich wollte noch so viel von 
Dir lernen. Geduld, Mitgefühl, anständiges Verhalten gegenüber deinen 
Mitmenschen und die einzig richtige Anwendung von Paradigmen. Wehe Du 
schmunzelst nicht!;)

Beitrag #6373087 wurde vom Autor gelöscht.
von Math (Gast)


Lesenswert?

Jedzia D. schrieb:
> Was Du hier suchst ist CultureInfo.InstalledUICulture,
> CultureInfo("en-GB") oder CultureInfo("de-DE"). Bei Ersterem, was die
> Grundeinstellung ist kann es dazu kommen, dass bei einem amerikanischen
> Nutzer dein Programm nicht funktioniert. Das Bedarf einer Prüfung und Du
> solltest dich in das Thema einlesen und darüber nachdenken.

habe ich. Wenn ich den invariant Befehl nutze, dann mit dem Ziel 
entweder von uS auf DE und andersherum. Messgerät benötigt US, meine 
Anwendungssoftware arbeitet mit DE. Und deswegen gibt es die häufigen 
Wechsel in meinem Code. Was auch soweit funktioniert bis auf die Zeile
GlobaleVariablen.Pulsbreite = string.Format(
txtPulsbreite.Text,CultureInfo.InvariantCulture);

ich glaube, dass die garnicht auf dem screen drauf ist. spielt aber auch 
keine Rolle

von Math (Gast)


Lesenswert?

Jedzia D. schrieb:
> Um zur Verwirrung beizutragen gibt es übrigens auch
> nochmessErgebnis.ToString("0.00"); //2 dezimalstellen
>
> messErgebnis.ToString("n2",
> System.Globalization.CultureInfo.InvariantCulture); // 2 dezimalstellen,
> kulturbezogene Trennzeichen

normalerweise hätte ich es so gemacht. aber dafür müsste ich jetzt eine 
menge Code ändern

von Zeno (Gast)


Lesenswert?

c-hater schrieb:
> Du arbeitest offensichtlich mit deutschen Locales. Und in der deutschen
> Kultur dient halt "." nicht als Dezimaltrenner. Sprich: gib einfach
> "3,22" statt "3.22" ein ud alles ist schick.

In C# gibt es das "Culture"-Property/Methode -ich weis nicht mehr genau 
ob's ein Property oder Methode war, bin aus dem Kram vor einem Jahr 
ausgestiegen - , womit sich solche Dinge lösen lassen. Ich meine mich 
noch dunkel zu erinnern das da "invariantCulture" oder so ähnlich weiter 
hilft, bin mir aber nicht mehr sicher. Suche mal nach diesem Begriff.

von S. R. (svenska)


Lesenswert?

Statt dem ganzen locale-Krampf würde ich vermutlich die Strings schlicht 
selbst zusammenbauen... das Ausgabeformat ist schließlich bekannt.

Und, wie bereits erwähnt, intern mit Integern arbeiten.

von Math (Gast)


Lesenswert?

Math schrieb:
> GlobaleVariablen.Pulsbreite = string.Format(
> txtPulsbreite.Text,CultureInfo.InvariantCulture);

danke für die Hinweise. Aber warum wird hier nicht von komma auf punkt 
gewechselt?

von Jedzia D. (Firma: Rast und Ruh) (jedzia)


Lesenswert?

Gegenvorschlag, @svenska:
Ich würde erst einmal verstehen wollen, was ich da eigentlich mache und 
die 10 minuten zum Verständnis von
s. 
https://docs.microsoft.com/de-de/dotnet/api/system.globalization.cultureinfo.invariantculture?view=netcore-3.1
aufbrigen, danach dann die richtige Methode wählen, wie z.B. "Invariant" 
von Maschine zu Maschine oder zum Speichern und eine spezifische, bzw. 
lokale Formatierungsmethode zum Anzeigen für den User.

Schwer ist das wirklich nicht.

von Jedzia D. (Firma: Rast und Ruh) (jedzia)


Lesenswert?

Math schrieb:
> Math schrieb:
>> GlobaleVariablen.Pulsbreite = string.Format(
>> txtPulsbreite.Text,CultureInfo.InvariantCulture);
>
> danke für die Hinweise. Aber warum wird hier nicht von komma auf punkt
> gewechselt?

weil: "Die invariante Kultur ist Kultur unabhängig. Sie ist mit der 
englischen Sprache verknüpft, aber nicht mit einem Land bzw. einer 
Region."
...
Ist der ERSTE Satz:)

von c-hater (Gast)


Lesenswert?

Math schrieb:

> danke für die Hinweise. Aber warum wird hier nicht von komma auf punkt
> gewechselt?

Laß' dir einfach mal die Bedeutung des Begriffes "invariant" in dein 
Gehirn rieseln...

Übrigens etwas, was einige der bisherigen Threadteilnehmer ebenfalls 
versäumt haben...

Ich möchte jetzt keine Namen nennen, aber jeder Interressierte kann das 
natürlich dem Thread entnehmen. Jedenfalls solange yalu nicht seine 
Connections spielen läßt. Da kann es schnell mal passieren, dass 
objektive Wahrheit einfach mal wegzensiert wird... Weil sie yalu nicht 
gefällt...

von Jedzia D. (Firma: Rast und Ruh) (jedzia)


Lesenswert?

Math schrieb:
> Math schrieb:
>> GlobaleVariablen.Pulsbreite = string.Format(
>> txtPulsbreite.Text,CultureInfo.InvariantCulture);
>
> danke für die Hinweise. Aber warum wird hier nicht von komma auf punkt
> gewechselt?

Falls es hilft, hier verschiedene Ausgaben von meinem System für dich 
zur Orientierungshilfe:
1
double val = 3.14159;
2
var result = val.ToString("n2", System.Globalization.CultureInfo.InvariantCulture);
3
result.Dump();
4
5
result = val.ToString("n2", System.Globalization.CultureInfo.CurrentUICulture);
6
result.Dump();
7
8
result = val.ToString("n2", new System.Globalization.CultureInfo("de-DE"));
9
result.Dump();

produziert (das Dump() ist hier die Ausgabe):
3.14 <- unabhängig der Kultur, immer gleiche Ausgabe
3.14 <- abhängig von den System-Einstellungen
3,14 <- Komma, Deutsch

OH EINE VERSCHWÖRUNG!!! Meine CurrentUICulture produziert auch einen 
Punkt.
Nein, mein System ist auf Amerikanisch eingestellt, sollte bei Dir aber 
wie das 3. Ergebnis aussehen.

: Bearbeitet durch User
von Jedzia D. (Firma: Rast und Ruh) (jedzia)


Lesenswert?

Und noch was zu dem Snippet von Dir: Das ist falsch!
1
// Du machst so was: Hast einen Format String ohne Formate und wunderst dich, wieso der nicht übersetzt wird.
2
// So funktioniert das aber nicht! 
3
string meinText = "Hallo ich bin 3,1234567, ein stinknormaler String. Folgende Parameter ignoriere ich!";
4
var result = string.Format( meinText, System.Globalization.CultureInfo.InvariantCulture);
5
result.Dump();
6
7
// (Kultur, FormatString, Argument1, Argument2, ....)
8
var richtig = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Das Ergebnis ist {0:N}", 3.14159);
9
richtig.Dump();
10
11
var richtig2 = string.Format(new System.Globalization.CultureInfo("de-DE"), "Das Ergebnis ist {0:N}", 3.14159);
12
richtig2.Dump();

Hallo ich bin 3,1234567, ein stinknormaler String. Folgende Parameter 
ignoriere ich!
Das Ergebnis ist 3.14
Das Ergebnis ist 3,14

: Bearbeitet durch User
von Math (Gast)


Lesenswert?

Jedzia D. schrieb:
> 3.14 <- unabhängig der Kultur, immer gleiche Ausgabe

aber das ist doch der Punkt. Jede Ausgabe müsste mit . erscheinen. Bei 
mit mir Komma

GlobaleVariablen.Pulsbreite = string.Format(
txtPulsbreite.Text,CultureInfo.InvariantCulture);

von Math (Gast)


Lesenswert?

Math schrieb:
> Jedzia D. schrieb:
>> 3.14 <- unabhängig der Kultur, immer gleiche Ausgabe
>
> aber das ist doch der Punkt. Jede Ausgabe müsste mit . erscheinen. Bei
> mit mir Komma
>
> GlobaleVariablen.Pulsbreite = string.Format(
> txtPulsbreite.Text,CultureInfo.InvariantCulture);

hat sich erledigt sry

von S. R. (svenska)


Lesenswert?

Jedzia D. schrieb:
> Gegenvorschlag, @svenska:
> Ich würde erst einmal verstehen wollen, was ich da eigentlich mache

Gut, ich gebe zu, dass ich mich weder mit C# noch mit .net jemals 
tiefgreifend beschäftigt habe.

Wenn ich merke, dass ich nicht mehr verstehe, was ich eigentlich tue 
(z.B. weil ich die Runtime nicht verstehe) und mich aus irgendwelchen 
Gründen nicht tief in das System einarbeiten kann oder will, dann baue 
ich Trivialfälle eben von Hand nach.

Es geht nicht darum, dass "dann mach es selbst" hier der richtige Ansatz 
ist, aber jeder Programmierer sollte in der Lage sein, einen korrekten 
String notfalls zu Fuß bauen zu können. Schließlich bringt es nichts, 
wenn man sich drei Tage mit der Runtime prügelt, nur um dann 
möglicherweise festzustellen, dass die vorhandenen Funktionen nicht 
mächtig(*) genug sind.

(*) In diesem Fall sind sie offensichtlich mächtig genug, aber das gilt 
nicht für jedes Framework - und die Antwort ist auch auch nicht immer 
offensichtlich. Fehlende Dokumentation ist genauso schädlich wie 
schlecht geschriebene Dokumentation oder das eigene Unverständnis, die 
Dokumentation zu verstehen.

von Antonow B. (antonow)


Lesenswert?

1
GlobaleVariablen.Angleich_Zeit = Convert.ToString(Math.Round(Convert.ToDecimal(GlobaleVariablen.Pulsbreite)/ 6),1);

bekomme die Fehlermeldung, dass die Konvertierung von Argument 2 nach 
System.Iformat.provider nicht möglic ist. Warum?

von Stefan F. (Gast)


Lesenswert?

Was hat das mit Potenzieren zu tun?

Gemäß 
https://docs.microsoft.com/de-de/dotnet/api/system.convert.todecimal?view=netcore-3.1 
meint die Fehlermeldung offenbar das zweite Argument der ToDecimal 
Funktion. Aber in dem von dir zitierten Quelltext sehe ich nur ein 
Argument. Die Fehlermeldung scheint sich auf einen anderen Quelltext zu 
beziehen.

Zerlege das mal in drei einzelne Zeilen, dann wird die Fehlermeldung 
vielleicht klarer, welcher Funktionsaufruf hier der problematische ist.

von Antonow B. (antonow)


Lesenswert?

Stefan ⛄ F. schrieb:
> Gemäß
> 
https://docs.microsoft.com/de-de/dotnet/api/system.convert.todecimal?view=netcore-3.1
> meint die Fehlermeldung offenbar das zweite Argument der ToDecimal
> Funktion. Aber in dem von dir zitierten Quelltext sehe ich nur ein
> Argument. Die Fehlermeldung scheint sich auf einen anderen Quelltext zu
> beziehen.

ist eine Falsche Klammerstellung. Das Argument, in dem die 
nacvhkommastellen angegeben werden, gehören zu math.round

von Stefan F. (Gast)


Lesenswert?

Dimha B. schrieb:
> ist eine Falsche Klammerstellung.

Ja, jetzt sehe ich es auch. Danke.

Das ",1" ist in der Fehlermeldung gemeint, und zwar für die Funktion

> ToString(Double, IFormatProvider)
> Konvertiert den Wert der angegebenen Gleitkommazahl mit doppelter
> Genauigkeit in die entsprechende Zeichenfolgendarstellung.

1 ist kein IFormatProvider.

Du wolltest wohl eher die Funktion

> ToString(Double, IFormatProvider)

verwenden und die ",1" als Argument zu Math.Round() verwenden. Also 
gehört das ",1" eine Klammer weiter nach links.

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.