[C#] Math.Round funktioniert nicht, wie es soll.

Status
Für weitere Antworten geschlossen.

Midnight_Myth

Premium
23 Apr. 2014
3.126
8.140
1.580
www.plauderkonfi.de
Da ich nicht weiß, ob das hier reinpasst, oder nicht, schreibe ich es einfach mal hier.

Ich versuche gerade ein neues Feature in einen Chatbot einzurichten.
Dort liest er eine Zahl von einer Seite ein und soll diese auf zwei Nachkommastellen kürzen.
Was allerdings nicht wirklich funktioniert.

Hier ist erst einmal der Code, der die Zahl einliest:
Code:
var starRating = Math.Round (Double.Parse ($"{obj["difficultyrating"]}"),2);

Eingelesen wird jeweils von einer solchen Seite: https://osu.ppy.sh/api/get_beatmaps?k=5779f915b115e6984ad1ef513441eeeabbb81b36&b=357602?m=0

Allerdings rundet es das nicht auf zwei Nachkommastellen ab, wie es das eigentlich machen sollte.
Als Ergebnis kommt das raus: 3,48359298706055E+15

Sieht da jemand den Fehler in der Zeile vom Code?
 
Da ich nicht weiß, ob das hier reinpasst, oder nicht, schreibe ich es einfach mal hier.

Ich versuche gerade ein neues Feature in einen Chatbot einzurichten.
Dort liest er eine Zahl von einer Seite ein und soll diese auf zwei Nachkommastellen kürzen.
Was allerdings nicht wirklich funktioniert.

Hier ist erst einmal der Code, der die Zahl einliest:
Code:
var starRating = Math.Round (Double.Parse ($"{obj["difficultyrating"]}"),2);

Eingelesen wird jeweils von einer solchen Seite: https://osu.ppy.sh/api/get_beatmaps?k=5779f915b115e6984ad1ef513441eeeabbb81b36&b=357602?m=0

Allerdings rundet es das nicht auf zwei Nachkommastellen ab, wie es das eigentlich machen sollte.
Als Ergebnis kommt das raus: 3,48359298706055E+15

Sieht da jemand den Fehler in der Zeile vom Code?
keine Ahnung wie das in C geht, in Java würde ich das grob so machen (nur dass ich den Rest einfach wegschneide...) bin btw ein absoluter Randy im Programmieren... geht also wahrscheinlich auch schneller.

float a = 1,414213562;
float b = a * 100;
int c = (int) b;
float d = (float) c;
float e = d / 100;

kann man die Idee grob auf Java übertragen?
 
keine Ahnung wie das in C geht, in Java würde ich das grob so machen (nur dass ich den Rest einfach wegschneide...) bin btw ein absoluter Randy im Programmieren... geht also wahrscheinlich auch schneller.

float a = 1,414213562;
float b = a * 100;
int c = (int) b;
float d = (float) c;
float e = d / 100;

kann man die Idee grob auf Java übertragen?
Hmh. Wenn ich es so versuche, kommt am Ende "-21474836,48" raus ._.
Frag mich nicht warum.

Auf Java kann ich es leider nicht wirklich übetragen, da ich das nicht kann.
 
keine Ahnung wie das in C geht, in Java würde ich das grob so machen (nur dass ich den Rest einfach wegschneide...) bin btw ein absoluter Randy im Programmieren... geht also wahrscheinlich auch schneller.

float a = 1,414213562;
float b = a * 100;
int c = (int) b;
float d = (float) c;
float e = d / 100;

kann man die Idee grob auf Java übertragen?
Jo, das wäre eine Möglichkeit. Mein Opa musste vor einigen Jahrzehnten auch noch die einzelnen Stellen verschieben :D
Sieht da jemand den Fehler in der Zeile vom Code?

var starRating = Math.Round (Double.Parse ($"{obj["difficultyrating"]}"),2);
Zum einen einfach nur double.Parse(difficultyrating), zum anderen hätte ich da noch ne Frage.
Der Link, den du mit angibst, verweist auf JSON. Wäre es nicht am einfachsten, wenn du eine Klasse nach dem Schema der JSON-Rückgabe anlegst und beispielsweise mit Newtonsoft.Json (per Nuget erhältlich ("install-package newtonsoft.json")) serialisierst?
Dann könntest du mit Klassenname.difficultyrating den Wert abrufen und er müsste sogar, wenn du das Attribut als double setzt, schon als double vorhanden sein.
Bei mir funktioniert die Methode an sich nämlich, du machst irgendwas innerhalb des double.Parse falsch. diese zwei Strings verstehe ich absolut gar nicht o_Oo_O
 
Zum einen einfach nur double.Parse(difficultyrating), zum anderen hätte ich da noch ne Frage.
Der Link, den du mit angibst, verweist auf JSON. Wäre es nicht am einfachsten, wenn du eine Klasse nach dem Schema der JSON-Rückgabe anlegst und beispielsweise mit Newtonsoft.Json (per Nuget erhältlich ("install-package newtonsoft.json")) serialisierst?
Dann könntest du mit Klassenname.difficultyrating den Wert abrufen und er müsste sogar, wenn du das Attribut als double setzt, schon als double vorhanden sein.
Bei mir funktioniert die Methode an sich nämlich, du machst irgendwas innerhalb des double.Parse falsch. diese zwei Strings verstehe ich absolut gar nicht o_Oo_O
Die Funktion an sich habe ich nur schon aus dem Code raus. Also nicht selber geschrieben. Heißt, ich müsste da komplett alles verändern, wenn ich es so machen wollte.
Es liest die Zahl ja sogar richtig ein und alles. Nur eben rundet es diese nicht.

Edit: Es ist zwar nicht so schön, aber ich denke ich hab es jetzt so, wie ich es will
Code:
var starRating = $"{obj["difficultyrating"]}";
                        starRating = starRating.Substring (0,(starRating.IndexOf ('.') + 3));

So zeigt es mir jedenfalls immer nur zwei Nachkommastellen an.

Also danke für die Hilfe ._.
Ich muss dann wohl auch schauen, ob das Math.Round bei anderen Zahlen funktioniert, oder ob es irgendwie kaputt ist. Auch wenn ich nicht wüsste, wie das passiert sein sollte.
 
Zuletzt bearbeitet:
Liegt es vielleicht daran, dass 3,48359298706055E+15 eigentlich gar keine Kommazahl ist, da es ausgeschrieben eine Zahl mit 15 Nullen ist und somit keine Zahl hinter dem Komma steht? Daher wird dort auch nichts gerundet.
 
Liegt es vielleicht daran, dass 3,48359298706055E+15 eigentlich gar keine Kommazahl ist, da es ausgeschrieben eine Zahl mit 15 Nullen ist und somit keine Zahl hinter dem Komma steht? Daher wird dort auch nichts gerundet.
In der Funktion wird die Zahl ja zu einer Double geparsed. Die Zahl die eingelesen wird, ist auch eigentlich folgende bei diesem Beispiel "3.483592987060547"

Wobei mir da eine Sache auffällt, wenn ich genau hinschaue. Die letzte Zahl dort wird abgerundet und es werden aus irgendeinem Grund sehr viele Nullen dazugerechnet ._.
 
Status
Für weitere Antworten geschlossen.

Soziale Medien

  • X
  • TikTok

Über uns

  • GommeHD.net ist einer der größten Minecraft-Server der Welt. Dir gefällt unser Server? Dann unterstütze uns durch einen Kauf im Shop!
  • Shop