Datenbanken

Datenbanken

Posts 1-2 of 2
  • User photo
    Guido Klein    Premium Member
    The company name is only visible to registered members.
    Bug beim SQL-Server??
    Ich glaube, ich habe ein Bug beim MSSQL Server gefunden.
    Das mein einen gewissen Informationsverlust beim kürzen von Nachkommastellen, ist ja bekannt.
    Aber man kann beim SQL-Server wohl auch einen Informationsgewimm gelten machen.

    DECLARE @test float
    SET @test = 88951.57
    select CONVERT(numeric(38,12), @test), CONVERT(numeric(38,2), @test)
    -------------------- ---------------------- --------------------------------------- ---------------------------------------
    different values => 88951,57 88951.570000000007 88951.57

    Vielleicht hat ja jemand eine Idee, wo die letzte 7 herkommt..

    Ich habe dies beim MS SQL-Server 2008 und 2008 R2 ausprobiert, dasselbe Ergebniss.

    Vielen Dank für Eure Beiträge.
  • User photo
    Hans Adams    Premium Member
    The company name is only visible to registered members.
    Re: Bug beim SQL-Server??
    Guido Klein schrieb:
    Ich glaube, ich habe ein Bug beim MSSQL Server gefunden. Das mein einen gewissen Informationsverlust beim kürzen von Nachkommastellen, ist ja bekannt.
    Aber man kann beim SQL-Server wohl auch einen Informationsgewimm gelten machen.
     
    DECLARE @test float
    SET @test = 88951.57
    select CONVERT(numeric(38,12), @test), CONVERT(numeric(38,2), @test)
    -------------------- ---------------------- --------------------------------------- ---------------------------------------
    different values => 88951,57 88951.570000000007 88951.57
     
    Vielleicht hat ja jemand eine Idee, wo die letzte 7 herkommt..
     

    Klar, aus der Gleitkommarithmetik.... Die Mantisse Deiner Zahl läßt sich nicht als endlichen (64Bit!) Dezimalbruch darstellen....

    Nun wurde die Textrepräsentation Deiner Zahl in die maschineninterne Gleitkommarepräsentation abgebildet, unter Verlust aller Dualstellen kleiner als -63. Und dann wurde diese Zahl wieder in eine Textrepräsentation Deiner Zahl umgewandelt.... und da knallte bei den kleinsten Dualstellen....

    Deshalb hat man ja Währungen generell nicht als Gleitkommazahl, sondern als Fixkommazahl in der BCD-Repräsentation dargestellt.... Mit korrekten kaufmännischen Rundungsverfahren gibt es o.g. Probleme nicht....

    Ich habe dies beim MS SQL-Server 2008 und 2008 R2 ausprobiert, dasselbe Ergebniss.
     
    Klar, die Gleitkommaarithmetik hat sich ja nicht geändert....

    Du kannst einmal Paranoia (http://www.netlib.org/paranoia/) auf (PL)SQL portieren, und dann Dein Blaues Wunder erleben.

    Empfiehlt HA
    Vielen Dank für Eure Beiträge.