C# Kommazahl berechen!

LennardB

Newbie
Registriert
Aug. 2017
Beiträge
4
Moin,
Mein Problem ist dass bei dieser Rechnung bei der Rechnung der Wert "1" rauskommt, obwohl egentlich der Wert "1,1137..." berechnet werden sollte. Da man mit double auch Kommawerte angeben kann erkenne ich den Fehler hinter dieser einfachen Rechnung nicht.

Danke

Code:

double Prozent = 340 / 2988 + 1;
label1.Text = Prozent.ToString();
 
klasse sprache, einfach mal was andres machen, als programmiert. wär ja nicht so, dass extra "double" definiert wurde anstatt "int". wer kommt auf so nen kontraintuitiven mist?

wenn sie schon pech beim denken haben, dann sollten sie auch konsequent die kommazahlen solange als "float" interpretieren, bis genügend nachkomma-nullen getippt wurden, um "double" zu benötigen.
 
Zuletzt bearbeitet von einem Moderator:
Die Sprache macht doch genau das was da steht: Teile einen Integer durch einen Integer, addiere einen Integer und cast das Ergebnis zu double.

Ist das ganze dämlich? ja, es wurde aber nichts gemacht was nicht da stand.

Ist übrigens nicht nur bei C# so.
 
Shadow127 schrieb:
Die Sprache macht doch genau das was da steht: Teile einen Integer durch einen Integer

Genau. Es ist eben so definiert dass das Ergebnis einer Integer-Division wieder ein Integer ist. Ich finde das ist durchaus auch eine sinnvolle Definition, denn es gibt durchaus Fälle in denen man genau so etwas braucht.
 
Den Code habe ich nur als Beispiel angewandt. Ich wollte einfach nur wissen weshalb ein Integer ausgegeben wird, und keine Kommazahl. Ich wusste halt nicht dass man .0 hinter die Integer schreiben muss damit sie als double angesehen werden. Da sollst du dich mal nicht so aufregen.
 
ja noch schöner, dann sind also alle sprachen so. ein grund mehr sich noch mehr drüber aufzuregen. wie kommt man auf so ein krankes konzept?

@TE
immerhin hat dir diese konvention ja das bein gestellt, vll. solltest du dich ein bisschen mehr aufregen, anstatt ich weniger ;)
 
Zuletzt bearbeitet von einem Moderator:
Ich denke es gibt gute Gründe weshalb man bei Operatoren und Funktionen keine Überladung anhand des Rückgabewertes zulässt. Bei so einfachen Sachen wie der Division mag das ja noch ok klingen, aber wenn es da geht dann auch bei komplexeren Sachen und dann wird das unübersichtlich.
 
@Mickey Cohen
Also wenn ich zwei Integer als Eingabe habe möchte ich natürlich auch einen Integer als Rückgabewert haben. Sonst wäre es ja ein wie Würfeln welchen Typ das Ergebnis hat...
Code:
var result_1 = 10 / 2; //Wäre das nach deiner Vorstellung int, float oder double
var result_2 = 9 / 2; //Wäre das nach deiner Vorstellung int, float oder double

var result_3 = result_1 / 2; //Wäre das nach deiner Vorstellung int, float oder double
var result_4 = result_2 / 2; //Wäre das nach deiner Vorstellung int, float oder double

Wenn ich nun den Divisor von der ersten beiden Operationen durch eine Variable beliebigen Typs austausche(Mit Generics/Templates) wird das ganze noch lustiger. :rolleyes:
 
@ Fonce

da geb ich dir recht, da bin ich voll bei dir.

nur war es in diesem fall so, dass vorher ausdrücklich bestimmt wurde, welcher datentyp es sein soll:

double Prozent = 340 / 2988 + 1;


oder sind in der informatik die integer-zahlen ein aliud zu den gleitkommazahlen und nicht wie in der mathematik, wo die ganzen zahlen eine teilmenge der rationalen zahlen sind? das würde dann bedeuten, dass beispielsweise a+b überhaupt nicht funktioniert, wenn gilt:
int a
double b

das wäre dann quasi, wie wenn man in der physik meter plus sekunde rechnet oder irgendso einen kram...?

ich bin deswegen so wütend, weil ständig irgendwas scheinbar total banales auftacht und ich es ums verrecken nicht kapieren kann...ich meine, ihr alle habt hier mehr ahnung von informatik als ich, und ich glaub euch das ja auch, es nervt mich nur tierisch, dass ich wieder mal der einzige bin, ders nicht rafft. manchmal denke ich, dass es schon direkt an ein wunder grenzt, dass ich das konzept des atmens durchdrungen habe -.- :D
 
Zuletzt bearbeitet von einem Moderator:
Der Wert von Prozent ist ja auch double, Aber die Berechnung ist mit Integer Werten. Du musst das ganze von Rechts nach Links lesen! Dee Ausdruck dort bedeutet

Dividiere Integer durch Integer. Addiere Integer. Initialisiere Double mit Integer.
 
Mickey Cohen schrieb:
wenn sie schon pech beim denken haben, dann sollten sie auch konsequent die kommazahlen solange als "float" interpretieren, bis genügend nachkomma-nullen getippt wurden, um "double" zu benötigen.
In welcher Programmiersprache ist das denn möglich? Als Programmierer fände ich diese Variante höchst unintuitiv und aufwändig.
Wenn du selbst programmieren würdest, wüsstest du, dass alles in einer fest vorgegebenen Reihenfolge abgearbeitet wird, und die ist in vielen Sprachen immer die selbe.

Komplett ausgeschrieben würde das so aussehen:
Code:
double Prozent = ( (double)( (340 / 2988) + 1 ) );
Der Compiler nimmt einem schon den impliziten cast auf double ab. Andersherum würde das übrigens nicht funktionieren.
Code:
int Prozent = 1.11; // bitte double implizit nach int konvertieren!
Da kann man den Compiler noch so sehr bitten, Semantik interessiert den nicht.
 
Mickey Cohen schrieb:
nur war es in diesem fall so, dass vorher ausdrücklich bestimmt wurde, welcher datentyp es sein soll:

double Prozent = 340 / 2988 + 1;

Das Problem ist das C# das so nicht unterstützt. Ich glaub es gibt so gut wie keine Programmiersprache die Operator- und Funktionsüberladung über den Rückgabewert erlaubt.

C# jedenfalls kennt nur ein (int) / (int) = (int) oder ein (double) / (double) = (double) aber kein (int) / (int) = (double) da das mit der ersten Definition kollidieren würde da nur anhand der EIngansparameter unterschieden wird welche Implementierung zur Anwendung kommt.

Ein "double x = 12.5 / 3" funktioniert, weil C# int implizit nach double casten kann und dann (double) / (double) = (double) zur Anwendung kommt.
 
Mickey Cohen schrieb:
oder sind in der informatik die integer-zahlen ein aliud zu den gleitkommazahlen und nicht wie in der mathematik, wo die ganzen zahlen eine teilmenge der rationalen zahlen sind?

Richtig. Intern werden Flieskommazahlen und Integer komplett anders dargestellt. Wenn du dann einen Ausdruck richtung (int)+(double) hast, wird idr int in double konvertiert damit man (double)+(double) rechnen kann. (genaue Umsetzung des +-Operators ist natürlich der Programmiersprache/dem Programmierer überlassen, das ist nur eine oft verwendete und sinnvolle Variante. Viele Compiler werfen dir aber eh eine Warning, wenn du so etwas schreibst.)
 
Wenn man die Überladung anhand des Rückgabetyps erlaubt, was soll dann bei
Code:
var prozent = 340 / 2988 + 1;
rauskommen? Oder noch besser
Code:
dynamic prozent = 340 / 2988 + 1;
 
Jepp, wobei ja "var" auch nur deshalb eingeführt werden konnte weil der Rückgabewert immer feststeht. Ohne das gäbe es dieses Schlüsselwort halt einfach nicht. Aber bei Dynamic wird's dann schwierig, der wird an manchen Stellen gebraucht. Aber auch so macht eine Überladung anhand des Rückgabewerts den Code nicht unbedingt übersichtlicher und lesbarer, was mit der Hauptgrund ist weshalb das keine Sprache unterstützt (oder gibt's da doch welche?)
 
Zurück
Oben