Round



  • Hi Jungs,
    es ist mir beinlich zu fragen, aber ich habe ein Problem mit Runden a dezimalzahl.

    float x= 22.25756
    

    ich möchte diese Zahl runden ,dass

    x= 22.26
    

    am Ende wenn ich x in sql table überweisen, gibt es mir in der Table tatsächlich
    22.26 und nicht 22.6000000000 or 22.59999999999



  • Und jetzt das ganze bitte noch einmal in verständlichem Deutsch - danke.



  • ok
    ich habe eine Zahl

    x= 22.25756
    

    ich will diese Zahl runden, dass die Zahl = 22.26 wird
    und wenn ich diese Zahl in einer SQL_Tabelle von Type float einfüge, wird diese Zahl = 22.26 und nicht 22.2599999 oder 22.26000000

    Bemerkung:-
    wenn ich in SQL die Zahl 22.26 direkt eingebe bleibt sie 22.26
    aber wenn ich sie durch das Tool eingebe, bekomme ich endlos Nachkommazahlen wie 22.259999999999.



  • dokdok2 schrieb:

    und wenn ich diese Zahl in einer SQL_Tabelle von Type float einfüge, wird diese Zahl = 22.26 und nicht 22.2599999 oder 22.26000000

    Schade, der Satz war wieder so mißverständlich wie oben.
    Gegenfrage zur Klärung:
    Du willst haben: 22.26
    Du macht ein Insert mit 22.26
    Wenn du dir den Tabelleninhalt anzeigen lässt, steht 22.25999999 oder 22.2600000 drin.

    Ja?
    Dann hab ich ne Antwort:
    Ich glaube, das ist normal so.
    Runde es einfach beim Anzeigen im Programm nochmal und gut ist. 😉



  • danke estartu, du hast mich nochmal verstanden, obwohl ich mein deutsch war nicht so schlimm denke 😮
    das Problem liegt daran, wenn ich nach diesen Zahlen mit den komischen Formaten in MSSQL abfragen, bekomme sie immer so kommisch geliefert.
    es kann auch Probleme auftauchen , wenn ich so abfrage:-

    if(wert == 22.26)
    {
      wert *5 ;
    }
    else
    {
      AfxMessageBox("Wert gibt nicht");
    }
    

    in diesem Fall

    22.26 != 22.259999999
    


  • Gleitkomma-Verarbeitung ist von Natur aus ungenau - da kannst du nichts dagegen machen. Du kannst höchstens erkennen, daß du ein Problem hast, und dich damit arrangieren. Eine Lösung wäre es, nicht exakt zu vergleichen (das scheitert an der Genauigkeit der Zahlendarstellung), sondern näherungsweise:

    if(fabs(wert-22.26)<numeric_limits<double>::epsilon()) ...
    

  • Mod



  • Danke,
    ich habe mir immer eine Logik daran.
    wenn

    If(wert - 22.26 >0.0001 )
    dann nicht gleich
    sonst gleich
    

    hier ist die Frage wenn ich 22.26 direkt in SQL eingebe bleibt 22.26
    wenn ich 22.26 mit Tool übergebe bekomme ich 22.2599999999
    wie kann ich das Ziel (22.26) erreichen.?
    Gibt es die Möglichkeit es zu realesieren?


  • Mod

    Das hängt doch auch von der Datenform in der SQL Datenbank ab.
    IN SQL gibt es numerische Typen, die nicht an diesen Rundungsproblemen "leiden".

    Wenn Du ein entsprechendes Update Statement mit 22.26 formst, dann kann der SQL Server das auch "verstehen"!
    In einem Recordset zum Beispiel bindest Du nun mal ein double, und dieses kan eben 22.26 nicht korrekt darstellen. Bei dieser Datenübertragung hast Du also schon ein Problem.

    OLEDB hat für so etwas z.B. den Datentyp DECIMAL, der eben nicht auf einer Zweierpotenz arbeitet. Aber mit diesem Datentyp kann man eben nicht so einfach rechnen wie mit einem double.

    Sobald irgendwelche Typentransformationen erfolgen kannst Du nicht mit Sicherheit sagen was ankommt.

    Schon gar nicht bei einer Transformation double <-> DECIMAL!



  • danke


Log in to reply