2017-04-03 3 views
0

Ich bin neu bei PG und ich frage mich, ob ich etwas "extra" machen muss, um Fließkomma-Mathematik richtig zu handhaben.Postgres Fließkomma Mathe - muss ich etwas Besonderes machen?

Zum Beispiel verwenden Sie in Ruby BigDecimal, und in Elixir verwenden Sie Decimal.

Was habe ich unter der besten Lösung für PG?

SELECT 
    COALESCE(SUM(active_service_fees.service_fee * (1::decimal - active_service_fees.withdraw_percentage_discount)), 0) 
FROM active_service_fees 

Datentypen:

service_fee integer NOT NULL 
withdraw_percentage_discount numeric(3,2) DEFAULT 0.0 NOT NULL 
+0

Die Umwandlung in Dezimalzahlen ist nicht erforderlich. –

+0

Ihre Mathematik hat keinen Gleitpunkt. –

+0

'remove_percentage_discount' ist eine Gleitkommazahl wie' 0.10'. Ist das nicht möglich? – Tallboy

Antwort

1

Es hängt davon ab, was Sie wollen.

Wenn Sie Gleitkommazahlen Sie die Datentypen real oder double precision verwenden müssen, auf Ihre Anforderungen an die Genauigkeit abhängig.

Diese Gleitkommazahlen benötigen einen festen Platz (4 oder 8 Bytes), sind in binärer Darstellung gespeichert und haben eine begrenzte Genauigkeit.

Wenn Sie beliebig genau wollen, können Sie die binär codierte Dezimalzahl Typ verwenden numeric (decimal ist ein Synonym für sie).

Diese Werte werden als Dezimalziffern gespeichert und die erforderliche Speichermenge hängt von der Anzahl der Ziffern ab.

Der große Vorteil von Gleitkommazahlen ist leistungs – Gleitkommaarithmetik in Hardware im Prozessor implementiert ist, während die Arithmetik auf BCD-Code in PostgreSQL implementiert ist.

Eine Daumenregel wäre:

  • Wenn Sie Werte benötigen, die genau bis zu einer bestimmten Anzahl von Nachkommastellen (wie monetären Daten) sind, und Sie brauchen nicht viele Berechnungen zu tun , verwenden Sie decimal.

  • Wenn Sie Zahlenverarbeitung durchführen müssen und keine auf eine feste Genauigkeit gerundeten Werte benötigen, verwenden Sie double precision.

+0

Dies ist eine sehr gute Antwort, danke. Im Grunde genommen sind mathematische Gleitkommafehler unmöglich, solange Sie 'numerisch' verwenden, weil es nur ein paar extra Bits für das Vorzeichen und den Exponenten oder was auch immer speichert (während es mit einem Gleitkomma-Wert in eine bestimmte Menge an Platz komprimiert wird)? – Tallboy

+0

Nun, wenn Sie 'numerisch (7,2)' verwenden, werden Sie viele Rundungsfehler bekommen, aber das ist, was Sie in diesem Fall fragen. Mit 'numeric (200,100)' erhalten Sie eine viel bessere Genauigkeit als mit 'double precision'. Bei Fließkommadatentypen können Sie Ihre Genauigkeit nicht * konfigurieren *. –

+0

Sorry, ich bin jetzt etwas verwirrt. Also wenn ich einen Prozentsatz als '0.10' oder' 1.00' oder '0 speichere.33 'bedeutet 10%, 100%, 33%, und ich möchte sicherstellen, dass meine Berechnung für' 123 * (1 - Prozent) 'genau ist, wobei' 123 'eine ganze Zahl ist (es ist die Menge an Geld in Cent) , ist es sicher für mich, 'number (3,2)' für den prozentualen Datentyp zu verwenden? – Tallboy

Verwandte Themen