AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [.NET] Math.Round() macht mich verrückt
Thema durchsuchen
Ansicht
Themen-Optionen

[.NET] Math.Round() macht mich verrückt

Ein Thema von Matze · begonnen am 12. Dez 2009 · letzter Beitrag vom 12. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

[.NET] Math.Round() macht mich verrückt

  Alt 12. Dez 2009, 12:59
Hi zusammen,

.NET macht mich noch wahnsinnig. Gibt es keine saubere Möglichkeit, das hier zu schreiben?

Code:
intVal = Convert.ToInt32(Math.Round(Convert.ToDouble(tView.Height / 2)));
Da geht absolut jede Übersicht verloren.
Minimal schöner wäre es so:

Code:
intVal = Convert.ToInt32(Math.Round(tView.Height / 2));
Das ist jedoch nicht zulässig:

Zitat:
Der Aufruf unterscheidet nicht eindeutig zwischen folgenden Methoden und Eigenschaften: "System.Math.Round(decimal)" und "System.Math.Round(double)"
Geht's noch?

Erwartet hätte ich eine solche Lösung:

Code:
intVal = Math.Round(tView.Height / 2);
Dass Math.Round() beim Runden auf 0 Nachkommastellen einen Double-Wert zurück gibt ist doch irgendwo krank.

Mit einem Typecast ginge es kurz, doch ich persönlich finde Typecasts unsauber, da man nicht exakt weiß, was da nun wie interpretiert wird (Holzhammermethode):

Code:
intVal = (int)(tView.Height/ 2)

Grüße, Matze
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#2

Re: [.NET] Math.Round() macht mich verrückt

  Alt 12. Dez 2009, 13:08
Von welchem Typ ist tView.Height? Diese Fehlermeldung mit dem Decimal kann ich mir im Moment nämlich nicht erklären.

Generell finde ich es meist undurchsichtiger, was eine Convert-Funktion macht als was ein Cast macht. Dein Cast würde btw immer abrunden, oder?
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: [.NET] Math.Round() macht mich verrückt

  Alt 12. Dez 2009, 13:11
Zitat von Christian S.:
Von welchem Typ ist tView.Height? Diese Fehlermeldung mit dem Decimal kann ich mir im Moment nämlich nicht erklären.
Das ist die Eigenschaft "Height" des TreeViews und somit ein Integer (int).

Zitat von Christian S.:
Generell finde ich es meist undurchsichtiger, was eine Convert-Funktion macht als was ein Cast macht. Dein Cast würde btw immer abrunden, oder?
Hehe, du bist dir also auch nicht sicher, oder? Und genau darum mag ich Typecasts nicht.

Ich habe es lieber, wenn man exakt sehen kann, was mit den Werten passiert. Und das ist bei den Convert-Methoden der Fall.
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#4

Re: [.NET] Math.Round() macht mich verrückt

  Alt 12. Dez 2009, 13:16
Zitat von Matze:
Zitat von Christian S.:
Generell finde ich es meist undurchsichtiger, was eine Convert-Funktion macht als was ein Cast macht. Dein Cast würde btw immer abrunden, oder?
Hehe, du bist dir also auch nicht sicher, oder?. Und genau darum mag ich Typecasts nicht.
Doch, ich bin mir sicher, aber wenn ein erfahrener Programmierer es anders benutzt, frage ich lieber nochmal nach. Ich kenne keine Sprache, in der ein Cast von Double nach Int runden würde.

Zitat von Matze:
Ich habe es lieber, wenn man exakt sehen kann, was mit den Werten passiert. Und das ist bei den Convert-Methoden der Fall.
Naja, wenn ich mir die Beschreibung von Convert.Int32 durchlese ...

Zitat:
Return Value
value rounded to the nearest 32-bit signed integer. If value is halfway between two whole numbers, the even number is returned; that is, 4.5 is converted to 4, and 5.5 is converted to 6.
Als wirklich durchsichtig würde ich das nicht bezeichnen.

Lösung für Dein Problem:
Code:
            int d = 5;
            int intVal = Convert.ToInt32(Math.Round(d / 2.0));
Also einfach "2.0" statt "2" schreiben.
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: [.NET] Math.Round() macht mich verrückt

  Alt 12. Dez 2009, 13:20
Was gefällt dir denn an diesem Code nicht?
Code:
int intVal = treeView.Height / 2;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#6

Re: [.NET] Math.Round() macht mich verrückt

  Alt 12. Dez 2009, 13:23
Zitat von Matze:
Code:
intVal = (int)(tView.Height/ 2)
Da merkt man das "C" in "C#". Ein Typecast rundet immer ab (oder, wenn man es wie Christian sagt, rundet gar nicht). Daher wäre dein Typcast auch möglich, wenn du denn das Ergebnis haben willst. Ansonsten ist es bei C (und offensichtlich auch bei C#) so, dass, sobald ein Operant ein Double-Wert ist, die Division mit Nachkommastellen von statten geht, ansonsten als Integer.

Daher wundert mich, dass, abhängig von der Deklaration von intVal, du das hier nicht nutzt:

Code:
intVal = tView.Height/ 2;
//Edit: Ach Mensch alzaimar, das war mein Part.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: [.NET] Math.Round() macht mich verrückt

  Alt 12. Dez 2009, 13:27
Danke Christian, dann mache ich das so.

@Mark/Daniel: Ich habe immer ein ungutes Gefühl, wenn ich einem Integer einen Nicht-Integer zuweise, da damit irgendwas gemacht wird, was nicht auf den ersten Blick ersichtlich ist. Ich habe es gerne "typensicher", zumindest im Code. Ich mag zwar PHP mit seinen komplett fehlenden Typen, aber das ist eine andere Geschichte.
Wobei die Beschreibung von Convert.ToInt32() auch nicht einleuchtender ist.

Edit: Um nochmals auf die von mir angesprochene Problematik zurückzukommen:
Was ist der Sinn dahinter, dass Math.Round() bei fehlender Angabe der Nachkommastellen und somit einem Runden auf eine Ganzzahl einen Double zurück gibt? Das ist für mich völliger Blödsinn.
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#8

Re: [.NET] Math.Round() macht mich verrückt

  Alt 12. Dez 2009, 13:32
Zitat von alzaimar:
Was gefällt dir denn an diesem Code nicht?
Code:
int intVal = treeView.Height / 2;
Das ist nicht äquivalent zum Runden, daher bin ich davon ausgegangen, dass Matze das nicht haben will.

Zitat von Matze:
@Mark/Daniel: Ich habe immer ein ungutes Gefühl, wenn ich einem Integer einen Nicht-Integer zuweise
Bei alzaimars Code tust Du das nicht. Integer dividiert durch Integer ergibt in C# wieder einen Integer! Das Ergebnis ist halt nur nicht dasselbe bei beim Runden
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: [.NET] Math.Round() macht mich verrückt

  Alt 12. Dez 2009, 13:34
Ich möchte damit nur eine Komponenten mittig positionieren. Also auf +/- einen Pixel kommt's mir da nicht an. Daher gingen beide Möglichkeiten.
Aber prinzipiell war es für mich mal interessant zu wissen, ob man das in C# bzw .NET sauber lösen kann. Meine Meinung ist: Jain mit Tendenz zu Nein.
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#10

Re: [.NET] Math.Round() macht mich verrückt

  Alt 12. Dez 2009, 13:43
Zitat von Matze:
Aber prinzipiell war es für mich mal interessant zu wissen, ob man das in C# bzw .NET sauber lösen kann. Meine Meinung ist: Jain mit Tendenz zu Nein.
Das kommt wohl ganz auf Deine eigene Defintion von sauber an.
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz