Announcement

Collapse
No announcement yet.

Ungenaue Double-Zahl bei Datenbankabfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ungenaue Double-Zahl bei Datenbankabfrage

    Hallo, ich habe ein Problem mit der Genauigkeit einer Zahl.

    Folgender Sachverhalt:

    Eine Stored Procedure gibt eine Tabelle zurück, die betreffende Spalte ist vom Datentyp Real. Die Zahl ist z.B. 50731.81200
    Jetzt frage ich die Daten mit einen ODBC-Command ab, schreibe sie mit Dataadapter in ein Dataset.
    Im Dataset hat die Spalte den Typ Double.

    Jetzt bekomme ich aber im Dataset die Zahl 50731.81250 angezeigt.

    Da ich in Gridview 3 Kommastellen benötige, steht dann dort .813 statt .812

    Wie bekomme ich dieses Problem gelöst?

  • #2
    Originally posted by VBler View Post
    Hallo, ich habe ein Problem mit der Genauigkeit einer Zahl.
    Das liegt höchstwahrscheinlich am Grundproblem von Double usw., nämlich der mangelnden Genauigkeit. Mehr dazu findest du beispielsweise bei
    [FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler (ist zwar C#, aber jedenfalls .NET und sollte deshalb zu verstehen sein).

    Jetzt frage ich die Daten mit einen ODBC-Command ab,
    Welche Datenbank wird benutzt? In aller Regel ist ein Connector, der zum DBMS passt, um Klassen besser als eine ODBC-Notlösung. Vielleicht enthält der "richtige" Connector sogar geeignete Methoden, die solche Umrechnungsfehler vermeiden.

    Wie bekomme ich dieses Problem gelöst?
    Es gibt vor allem zwei Wege: über Decimal oder Zwischenrechnungen als Integer. Unter Umständen helfen auch besser passende Datentypen; aber dazu fehlt zumindest die Angabe der Datenbank. Jürgen

    Comment


    • #3
      Es steht keine andere Möglichkeit neben ODBC zur Verfügung.

      Ich würde ja gerne Decimal verwenden, leider habe ich dann nur 2 Kommastellen:

      dsDaten.Tables("dtRohdaten").Columns.Add("t_Menge" , GetType(Decimal))

      Comment


      • #4
        Meinst du wirklich Gridview aus dem Web-Namespace oder DataGridView?

        Ich habe schon lange nichts mehr mit .NET gemacht; aber nach kurzer Suche finde ich zum DataGridView folgende Auskunft:
        Um Werte im DataGridView zu formatieren gibt es für jede Column im DefaultCellStyle eine Format-Property (lässt sich im Designer einstellen).
        Dazu liefert MSDN die Erläuterung zu datagridviewcellstyle.format. Für das Web-Gridview gibt es vermutlich ähnliche Möglichkeiten. Jürgen

        Comment


        • #5
          Ich habe mir ein Gridview aus der Toolbox in die Oberfläche gezogen.

          Ich formatiere dort auch schon den Wert mit
          DataFormatString="{0:N3}"
          Das würde auch funktionieren (klappt bei z.B. 2 Kommastellen). Allerdings ist der Wert in der Quelle, also der Datatable im Dataset, schon falsch. Ich muss es richtig mittels ODBC in das Dataset bekommen.

          Comment


          • #6
            Du könntest versuchen schon im SQL die betroffene Spalte auf einen BCD Typ (wie zum Beispiel Decimal) zu casten.

            Woher weißt du eigentlich was der richtige Wert ist? Ich sehe in deinem ersten Post erstmal nur zwei unterschiedliche. Wenn du denn ersten Wert über irgendein SQL Frontend gesehen hast mußt der nicht zwingend richtiger sein als das was im Dataset ankommt. Rein vom Gefühl her würde ich sogar vermuten das dein erster Wert falsch ist da der weniger signifikante Stellen hat. Wenn der als double in .NET nicht darstellbar wäre kann ich mir kaum vorstellen das dann eine weitere signifikante Stelle mit Wert 5 hinzu kämme.

            Comment


            • #7
              Originally posted by Ralf Jansen View Post
              Du könntest versuchen schon im SQL die betroffene Spalte auf einen BCD Typ (wie zum Beispiel Decimal) zu casten.

              Woher weißt du eigentlich was der richtige Wert ist? Ich sehe in deinem ersten Post erstmal nur zwei unterschiedliche. Wenn du denn ersten Wert über irgendein SQL Frontend gesehen hast mußt der nicht zwingend richtiger sein als das was im Dataset ankommt. Rein vom Gefühl her würde ich sogar vermuten das dein erster Wert falsch ist da der weniger signifikante Stellen hat. Wenn der als double in .NET nicht darstellbar wäre kann ich mir kaum vorstellen das dann eine weitere signifikante Stelle mit Wert 5 hinzu kämme.
              Ich caste die Spalte im SQL (Ausgabe Prozedur) schon richtig. Dort wird sie dann so angezeigt wie es sein sollte. Die Kommastellen sind so richtig. Mein Taschnrechner zeigt es auch so an Der Fehler liegt mit ziemlich hoher Wahrscheinlichkeit im Dataset.

              Comment


              • #8
                Jetzt bekomme ich aber im Dataset die Zahl 50731.81250 angezeigt.

                Da ich in Gridview 3 Kommastellen benötige, steht dann dort .813 statt .812
                Wenn die erste Zahl richtig ist frage ich mich dann jetzt in wieweit die 2.te falsch ist. In .Net wird standardmäßig Bankers Rounding verwendet heißt zur nächsten geraden Zahl. Wenn .8125 wirklich richtig ist dann würde also zu .812 gerundet werden.

                Ich caste die Spalte im SQL (Ausgabe Prozedur) schon richtig
                In einen Real?

                Comment


                • #9
                  Originally posted by Ralf Jansen View Post
                  Wenn die erste Zahl richtig ist frage ich mich dann jetzt in wieweit die 2.te falsch ist. In .Net wird standardmäßig Bankers Rounding verwendet heißt zur nächsten geraden Zahl. Wenn .8125 wirklich richtig ist dann würde also zu .812 gerundet werden.



                  In einen Real?
                  Ja, zu Real.

                  Comment


                  • #10
                    Ich caste die Spalte im SQL (Ausgabe Prozedur) schon richtig
                    Auf die Frage ob du da Decimals benutzt. Und jetzt ...

                    Ja, zu Real.
                    ... sagst du das sei ein Real. Wir hatten schon festgestellt das Fließkommazahlen ungeeignet sind wenn man eine genau Darstellung der signifikanten Stellen braucht. Also benutze Decimal.

                    Wenn du durchgängig in der DB, bei der Übertragung und im Dataset einen BCD Typ (also einen Decimal) benutzt kann das nicht auftreten. Wenn doch solltest du mal den Hersteller deines ODBC Treibers hinterfragen ob es da eine Bug gibt.

                    Comment

                    Working...
                    X