Laden...

Fehler: "Der Wert für eine Decimal war zu groß oder zu klein"

Erstellt von JuniorProgrammierer vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.895 Views
J
JuniorProgrammierer Themenstarter:in
33 Beiträge seit 2015
vor 7 Jahren
Fehler: "Der Wert für eine Decimal war zu groß oder zu klein"

Moin an alle,
und zwar bin ich heute auf folgendes Problem gestoßen:

Ich lese eine Datei mit Koordinaten ein - > dann muss es mir die Länge der Strecke berechnen.
Ich habe jetzt 2 verschiedenen Dateien mit einer und der selben Strecke, nur eine Datei hat auf der Strecke 100 punkte und andere 200 Punkte.

Die 100Punkte Datei wird eingelesen, Länge der Strecke berechnet und angezeigt
Die 200Punkte Datei wird eingelesen, Fehlermeldung > Fehlermeldung:

Der Wert für eine Decimal war zu groß oder zu klein. erscheint.

 
        private double distance(double lat1, double lon1, double lat2, double lon2)
        {
            double theta = lon1 - lon2;
            double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
            dist = Math.Acos(dist);
            dist = rad2deg(dist);
            dist = dist * 60 * 1.1515;
            dist = dist * 1.609344 * 1000;

            return dist;
        }

        private double deg2rad(double deg)
        {
            return (deg * Math.PI / 180.0);
        }
        private double rad2deg(double rad)
        {
            return (rad / Math.PI * 180.0);
        }

        private void längeberechnen(double lat1, double lon1, double lat2, double lon2)
        {
            
            inkm2 = distance(lat1, lon1, lat2, lon2);
            inkm += inkm2;
            textBoxLaenge.Text = Convert.ToDecimal(inkm).ToString("0.00");
            
        }

Was muss ich ändern ? Bzw wo liegt mein Fehler ?

J
251 Beiträge seit 2012
vor 7 Jahren

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Die Rechnung nachgegangen und die Zahlen überprüft?

3.003 Beiträge seit 2006
vor 7 Jahren

Ich sehe nicht, wo dein Convert.ToDecimal() Sinn ergibt - sollte aber erst einmal nichts machen. Um herauszufinden, was da los ist:

  • try-catch um " textBoxLaenge.Text = Convert.ToDecimal(inkm).ToString("0.00");"
  • breakpoint im catch
  • debuggen und nachschauen, für welche long/lat-Werte der Fehler kommt

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

J
JuniorProgrammierer Themenstarter:in
33 Beiträge seit 2015
vor 7 Jahren

Die Rechnung nachgegangen und die Zahlen überprüft?

Ja das habe ich gemacht. Die Zahlen stimmen und es rechnet richtig. Lösche ich aus der 200Punkte Datei so 50 beliebige Punkte funktioniert es wieder einwandfrei. 8o

Bin gerade echt verzweifelt 🙁

Ich sehe nicht, wo dein Convert.ToDecimal() Sinn ergibt

Sobald ich es weg lasse kommt in der textBox =>** n. def.**

3.003 Beiträge seit 2006
vor 7 Jahren

Na, dann mach doch mal das, was ich schrieb 🤔

Du hast offenbar Punkte dabei, bei denen durch 0 geteilt wird oder durch etwas, was sehr nahe an 0 ist.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

J
JuniorProgrammierer Themenstarter:in
33 Beiträge seit 2015
vor 7 Jahren

Also habe es jetzt in try - catch gesetzt und es kommt bei jedem Durchlauf die Exception(s. Anhang)

16.841 Beiträge seit 2008
vor 7 Jahren

Was mir bei Deinen Methodennamen auffällt: schreib sie in Englisch.
[Artikel] C#: Richtlinien für die Namensvergabe

Bitte Fehler nicht als Screenshot, sondern die Error-BBCode-Tags verwenden - dafür sind sie da.

In der Doku steht, dass diese Exception kommt, wenn der übergebene Wert größer ist als Decimal.MaxValue.
Hast Du das überprüft?

Ich kenn übrigens keine Lat/Long-Berechnung, die nicht double verwendet.
Das Convert macht hier keinen Sinn.

3.003 Beiträge seit 2006
vor 7 Jahren

Hier im Forum kann keiner für dich deine Maus greifen und über die Variablen und die Aufrufliste in deinem Visual Studio fahren. Das musst du schon selbst machen.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

3.170 Beiträge seit 2006
vor 7 Jahren

Hallo,

Sobald ich es weg lasse kommt in der textBox => n. def.

Das und die Fehlermeldung deuten beide darauf hin, dass irgendwo double.NaN ensteht in der distance-Funktion.

Also prüfe mit 
if(!double.IsNaN(inkm))
    textBoxLaenge.Text = Convert.ToDecimal(inkm).ToString("0.00");
else
{
    // hier ist was schiefgelaufen. 
    // Koordinaten ansehen und beim nächsten mal diese speziellen Koordinaten per if-Abfrage
    // vor dem Aufruf abfangen, Haltepunkt setzen, durchsteppen, gucken was passiert.
}

Gruß, MarsStein

Edit: hatte ich doch das ! vor der Bedingung vergessen... wie im richtigen Leben 😉

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

J
JuniorProgrammierer Themenstarter:in
33 Beiträge seit 2015
vor 7 Jahren

Habe mein Problem gelöst.
war bei einem Punkt die Koordinaten falsch, die beim anzeigen nicht berücksichtigt wird aber beim berechnen.

Danke für die Tipps

mfg Junior