Nur drei signifikante Stellen im Ergebnis erzwingen

Vielleicht mit BIGINT?

test=# select 12345678901::int;
ERROR:  integer out of range
test=!# rollback;
ROLLBACK
Zeit: 0,189 ms
test=# select 1234567890123456789::bigint;
        int8
---------------------
 1234567890123456789
(1 Zeile)

Andreas

seufz mit BIGINT. Oder doch einfach mal in die Dokumentation schauen, da sind alle Datentypen erklärt.



in den meisten Fällen funktioniert das mit log, nur warum wird z.B. aus
21.2 → 21

Weil 21.2 kein Integer ist.
Ev. möchtest du auch mit Floating Point oder Numeric Werten arbeiten.

21.2 hat doch schon drei signifikante Stellen…[/QUOTE]

Okay stimmt. Also mit ::float probiert. geht aber nicht weil:
ERROR: function trunc(double precision, integer) does not exist.



test=*# select trunc(1.2345::real, 2);
ERROR:  function trunc(real, integer) does not exist
ZEILE 1: select trunc(1.2345::real, 2);
                ^
TIP:  No function matches the given name and argument types. You might need to add explicit type casts.
test=!# rollback;
ROLLBACK
Zeit: 0,303 ms
test=# select trunc(1.2345::real::numeric, 2);
 trunc
-------
  1.23
(1 Zeile)

Andreas

hm, ::real::numeric hilft teilweise, teilweise wird aber immer nuch z.B 67,3334534 auf 67 gekürzt

Es ist leidlich schwer zu erraten, was Du tust.

Andreas

naja ich wende symbionts methode

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

an, um drei signifikante stellen zu erzwingen mit folgenden Ergebnissen für x

127.4173621283 --> 127
118.5 —> 118
115.6 --> 115
91.8506 --> 91
90.442 --> 90
40.448323 --> 40
29.77501 --> 29.7
22.843248 --> 22.8
14.6082323521 --14.6
13.46 --> 13.4
10.6 --> 10.6

Das kommt mit nicht ganz okay vor, vor allem nicht
91.8506 --> 91
90.442 --> 90
40.448323 --> 40

grüße

Irgendwie stehe ich auf dem Schlauch. Was ist denn an round() verkehrt?

Das macht doch genau das, was gewünscht ist.

Oder habe ich was übersehen?

postgres=> with dummy (x) as
postgres-> (
postgres(>   values
postgres(>   (127.4173621283),
postgres(>   (118.5),
postgres(>   (115.6),
postgres(>   (91.8506),
postgres(>   (90.442),
postgres(>   (40.448323),
postgres(>   (29.77501),
postgres(>   (22.843248),
postgres(>   (14.6082323521),
postgres(>   (13.46),
postgres(>   (10.6)
postgres(> )
postgres-> select round(x,3)
postgres-> from dummy;
  round
---------
 127.417
 118.500
 115.600
  91.851
  90.442
  40.448
  29.775
  22.843
  14.608
  13.460
  10.600
(11 rows)

es geht um drei signifikante Stellen, d.h. ein wert 698321409 wird zu 698000000, ein wert 0,7889 zu 0,789 oder 10,34 zu 10,4 etc. etc. bitte mal nachgooglen und den thread hier von Anfang an lesen.

Ich hatte den Thread gelesen, aber offensichtlich das Problem nicht verstanden :wink:

so nach langem ausprobieren lautet die für mich richtige lösung

round(((x)::numeric), ((2.5-(log(x)))::int))

die klammern machens wohl aus…

Danke an alle Beteiligten für die Hilfe!