Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 31

Thema: Nur drei signifikante Stellen im Ergebnis erzwingen

  1. #1
    rajanski ist offline Benutzer
    Registriert seit
    03.02.2009
    Beiträge
    49

    Standard Nur drei signifikante Stellen im Ergebnis erzwingen

    Hallo zusammen,

    Gibt es eine Möglichkeit, im Ergebnis von Abfragen immer nur drei signifikante Stellen auszugeben?

    z.B.
    1,45456 --> 1,46
    1.657.456.456,8934 --> 1.660.000.000,000
    0,1 --> 0,100

    etc.



    grüße!

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    In Mathe habe ich mal folgendes gelernt:

    Code:
    1.4567 * 1000, Nachkommastellen abschneiden, durch 1000 dividieren
    Das umgesetzt in SQL sieht ungefähr so aus:

    Code:
    SELECT (1.456754 * 1000)::INT::FLOAT / 1000;
    Da kann man jetzt statt den Casts noch passend ROUND() oder FLOOR() einstreuen.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  3. #3
    rajanski ist offline Benutzer
    Registriert seit
    03.02.2009
    Beiträge
    49

    Standard

    danke!

    was meinst du mit casts? sorry bin newbie...

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von rajanski Beitrag anzeigen
    danke!

    was meinst du mit casts? sorry bin newbie...
    Eine Typumwandlung. So ist z.B. '123' ein String. Doch schaue selber:

    Code:
    test=*# select '123';
     ?column?
    ----------
     123
    (1 row)
    
    test=*# select cast('123' as int);
     int4
    ------
      123
    (1 row)
    
    test=*# select '123'::int;
     int4
    ------
      123
    (1 row)
    Das cast(...) ist SQL.Spec, das ..int ist eine Vereinfachung von PG und nicht portabel.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    Gähn

    Code:
    select trunc(x, -log(x)::int + 2)
    Demo
    Code:
    WITH vals(x) AS (
        VALUES(123456789), (123.456), (1.23456), (0.0000123456)
    )
    SELECT trunc(x, -log(x)::int + 2) FROM vals
    ------------------------------------------------
    123000000
    123
    1.23
    0.0000123
    Zitat Zitat von akretschmer Beitrag anzeigen
    Eine Typumwandlung. So ist z.B. '123' ein String. Doch schaue selber:

    Code:
    test=*# select '123';
     ?column?
    ----------
     123
    (1 row)
    
    test=*# select cast('123' as int);
     int4
    ------
      123
    (1 row)
    
    test=*# select '123'::int;
     int4
    ------
      123
    (1 row)
    Das cast(...) ist SQL.Spec, das ..int ist eine Vereinfachung von PG und nicht portabel.

    Andreas
    Geändert von symbiont (19.11.2009 um 12:25 Uhr)

  6. #6
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Also, symbiont, ich weiß zwar nicht, wo du im Matheunterricht warst, aber die Verwendung von log(x) an dieser Stelle ist eine große Verschwendung.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  7. #7
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    warum soll das verschwendung sein .. log(x) kann ein prozessor im schlaf (seit es FPUs gibt - seit 10 jahren oder laenger?)

    das ist 1. um fantastillionen % effizienter
    und 2. funktioniert es korrekt

    anders als dieses dividiere und gecaste in strings was ohnehin nicht zum ergebnis fuehrt

    aber ist ja auch egal .. wo du in mathe warst hast ja bereits demonstriert

    ein alter x87er macht das so
    Code:
    ; LOG(x)-       Computes the base 10 logarithm of x.
    ;               Usual range for x (>0).
    ;
    ;       LOG(x) = lg(x)/lg(10).
    
    log             proc    near
                    fld1
                    fxch
                    fyl2x           ;Compute 1*lg(x).
                    fldl2t          ;Load lg(10).
                    fdiv            ;Compute lg(x)/lg(10).
                    ret
    log             endp
    
    ein moderner hat dafuer wahrscheinlich einen opcode - bin mir da aber nicht sicher, was den "wahnsinns aufwand" nochmal etwas mehr als halbieren wuerde

    und wie wir sehen muss da noch ein abs( .. ) umd das x im log(..)
    weil: select log(-1) => FEHLER: Logarithmus negativer Zahlen kann nicht ermittelt werden
    SQL Status:2201E


    also:
    Code:
    select trunc(x, -log(abs(x))::int + 2)

    Geändert von symbiont (19.11.2009 um 14:59 Uhr)

  8. #8
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    und es fehlt noch ein + 0.5

    select trunc(x, (-log(abs(x)) + 0.5)::int + 2)

    oder man benutzt round() ..
    Geändert von symbiont (19.11.2009 um 16:14 Uhr)

  9. #9
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Ja, schön, was dein Assembler alles kann - wenn man mal bis dorthin kommt. Die ganze log() Berechnung, nur um die Anzahl Stellen zu ermitteln, ist trotzdem recht sinnlos und verkompliziert das ganze nur unnötig.

    Eine Multiplikation mit 1000 kann die gleiche FPU, die auch für dein log() bemüht wird, nur ist das halt einfacher zu lesen und weniger Code und Rechenoperationen. Das "gecaste" kann mit ROUND() oder FLOOR() erledigt werden, das sagte ich aber schon in meinem ersten Posting.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  10. #10
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    nur dass dir deine multiplikation mit 1000 rein garnichts bringt .. deine "loesung" ist schlichtweg falsch

    und immernoch ist da kein "ganze log() Berechnung" .. da ist nix aufwendiges dabei ..

    die anwendung des log(x) ist schlicht und ergreifend die richtige loesung der gestellten aufgabe

    aber egal ..
    Geändert von symbiont (19.11.2009 um 17:18 Uhr)

Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

  1. Polygon-Schließung erzwingen
    Von TobWen im Forum PostGIS
    Antworten: 4
    Letzter Beitrag: 13.05.2009, 20:30
  2. Client -> Disconnect erzwingen
    Von CenText im Forum Benutzer- & Rechteverwaltung
    Antworten: 10
    Letzter Beitrag: 26.11.2008, 13:19
  3. Problem Multi-Join Komplizierte SQL-Abfrage v. drei Tabellen
    Von grafik2 im Forum SQL
    Antworten: 8
    Letzter Beitrag: 06.10.2008, 15:23
  4. Server im netzwerk zur verfügung stellen... :(
    Von MyLittleBunny im Forum Konfiguration
    Antworten: 8
    Letzter Beitrag: 04.03.2008, 07:11
  5. die letzten drei zeilen der tabelle ausgeben?
    Von hatori.hanzo im Forum Allgemeines
    Antworten: 1
    Letzter Beitrag: 07.09.2007, 19:47

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum