C# Runden verhindern

Murphy9904

Lt. Junior Grade
Registriert
Mai 2007
Beiträge
344
Hi,
hab mal ne ganz doofe Frage
also ich hab volgende Rechnung:
(360 / 60) * (11 * 5 + 5 / (60 / 50))
das ergibt auf einem normalen Taschenrechner = 275
aber mein C# gibt = 360 aus

ich habe dann die Variablen durch "echte Zahlen" ersetzt und immernoch der Rechenfehler..

warscheinlich rundet der beim Rechnen.. aber das soll er ja nicht.. zumindest nicht mit den Zwischenergebnissen.

was kann ich da machen?

LG Murphy
 
Also das Ergebnis lautet bei dieser Rechnung 300 und nicht 275 wenn ich mich nicht ganz irre.
Mit welchem Datentyp hast du denn gerechnet? Wahrscheinlich mit int so wie es hier aussieht, das würde nämlich auch erklären warum dann 360 rauskommt. Das Ergebnis für 60/50 ist mit int nämlich 1.
Probiers mal mit float oder double aus.

MfG
 
ich komme auf 355 auf dem taschenrechner.

und auch wenn ich eine Zahl als float deklariere, komme ich auf 355

Code:
int dd = (360 / 60) * (11 * 5 + 5 / (60f / 50));
durch das 'f' wird mit nicht mehr ganzzahlig gerechnet, sondern eben gleitkomma.
 
Zuletzt bearbeitet:
Ich habs eben selbst nachgerechnet und komme auf 355.
Im Endeffekt ist (360 / 60) * (11 * 5 + 5 / (60 / 50)) das gleiche wie 6 * (55 + 250 / 60).
Allerdings hat C# bzw. .NET(?!) das Problem das er automatisch rundet wenn der Input als Integer angegeben wird aber im Endeffekt eine Fließkomma-Zahl dabei rauskommt.

Könntest es zum test auch in decimal oder float umwandeln.
 
Also wenn ich recht sehe solltest du deine Klammersetzung überdenken

(360 / 60) * (11 * 5 + 5 / (60 / 50)) da stimmt bei 11*5+5 irgendwas mit den Klammern nicht.

So rechnet er ja 6*(55 + 5/1,2) und da kommt mal 355 raus.

ich weiß nur noch nicht wie du auf 275 kommst :-)
 
ja 355 :D sorry
und das "F" hinter der zahl bringts jetzt rechnet er das ganz brav aus :) danke
 
Auch wenn das Problem jetzt gelöst "scheint" sollte dir klar sein, dass du das grundsätzlich vom "Design" her falsch gemacht hast.

Stell dir vor du korrigierst die Formel irgendwann mal und das F geht verloren. Dann findet wieder die Runderei statt und das Problem ist wieder da - ein Fehler der evtl nichmal sofort auffällt und schwer zu finden sein wird.
Viel sinnvoller wäre es vorher zu sagen "ich muss im folgenden einige Zahlen dividieren und verwende daher direkt einen anderen Datentyp als int, (wie float, double) damit die Nachkommastellen IMMER berücksichtigt werden"

Dein F führt ja nur dazu, dass die ints wie floats behandelt werden
 
ich möchte aber am ende ein Int raushaben. nur wärend dem Rechnen eben nicht..
 
Mh sonst mach sowas wie
float zwischenErgebnis = .... // Rechnung mit divisionen
und am Ende dann
int result = (int) (zwischenErgebnis + 0.5);

Die 0.5 sind wichtig weil sonst beim Cast auch nicht mathematisch korrekt gerundet wird sondern die Nachkommastellen einfach wegfallen

float a = 1.9;
int b = (int) a;
sollte b = 1 verursachen, weil 1,9 nicht gerundet wird. Die +0.5 verursacht dann trotz wegfallen der Nachkommastellen ne korrekte Rundung (weil zB hier statt 1.9 dann 2.4 benutzt wird)
 
Ok gut werd ich so machen
danke für den Hinweis :)
 
Joa immer gerne :) Natürlich sind bei kleinen Freizeit-Projekten Design-Dinge nicht übermäßig wichtig aber gerade das mit dem Runden sollte man immer im Hinterkopf haben.. ich vermute nämlich, dass deine jetzige/vorige Lösung wenn am Ende das mit F gerechnete Resultat nem int zugewiesen wird sich "verrechnet" weil es ohne die +0.5 eben nicht rundet sondern einfach abschneidet
 
Ja, das ist aber in meinem Fall nicht so sehr wichtig.. ich hab mir damit ne AnalogUhr gebastelt ;)
(und es merkt kein mensch wenn Der Zeiger um ein Grad verschoben ist.) :D
 
ichhalt123 schrieb:
Allerdings hat C# bzw. .NET(?!) das Problem das er automatisch rundet wenn der Input als Integer angegeben wird aber im Endeffekt eine Fließkomma-Zahl dabei rauskommt.

Es wird dort gar nichts gerundet.. wenn alle Operanden als Integer definiert sind, so wird aber nun mal auch das Ergebnis als Integer zurückgegeben.

Außerdem ist das kein Problem von .NET, sondern von so ziemlich allen mir bekannten typsicheren Sprachen... und das ist auch gewollt so, von Problem kann man nicht wirklich sprechen.
 
gerundet wird nicht aber bei jeden Zwischenergebniss werden die Nachkommastellen abgeschnitten.
und in meinem Fall war das ein Problem würde ich sagen :D
 
Zurück
Oben