Gibt es einen guten Grund für die Prozentsätze zu speichern, die weniger als 1 als Zahlen, die größer als 1?

StackOverflow https://stackoverflow.com/questions/288575

  •  08-07-2019
  •  | 
  •  

Frage

Ich erbte ein Projekt, das SQL Server verwendet 200x, wobei eine Spalte, die einen Wert speichert, der immer als ein Prozentsatz im Problembereich betrachtet wird als größer als 1 Dezimaläquivalents gespeichert ist. Zum Beispiel: 70% (0,7 wahrsten Sinne des Wortes) als 70 gespeichert, 100% als 100 , usw. Abgesehen von der Notwendigkeit zu erinnern, Werte * 0,01 auf abgerufen und * 100, bevor Werte persistierenden, es scheint nicht ein Problem in sich selbst zu sein. Es tut mein Kopf, obwohl sie explodieren ... so gibt es einen guten Grund dafür, dass ich fehle? Gibt es zwingende Gründe, es zu beheben, da es eine ganze Menge Code geschrieben, mit den pseudo-Prozentsatz zu arbeiten?

Es gibt einige Fälle, in denen mehr als 100% auf, aber ich sehe nicht, warum sollte der Wert nicht nur als 1.05 gespeichert werden, zum Beispiel in den Fällen.

EDIT: Kopf besser fühlen und etwas schlauer. Danke für all die Einsichten.

War es hilfreich?

Lösung

Es gibt tatsächlich vier gute Gründe, warum ich daran denken können Sie speichern-und möchten berechnen mit-ganzzahligen Prozentwerte anstatt Gleitkommazahlen Äquivalente:

  1. In Abhängigkeit von den Datentypen gewählt, kann der Integer-Wert weniger Platz in Anspruch nehmen.
  2. auf den Datentyp je nach der Fließkommawert Genauigkeit verlieren kann (denken Sie daran, dass nicht alle Sprachen einen Datentyp entspricht SQL Server decimal Typ haben).
  3. Wenn der Wert Eingabe von oder der Ausgabe sehr häufig an den Benutzer sein wird, kann es günstiger sein, es zu halten, in einem benutzerfreundlichen Format (Entscheidung zwischen konvertieren, wenn Sie anzeigen und konvertieren, wenn Sie berechnen ... aber sehen der nächste Punkt).
  4. Wenn die Hauptwerte sind auch ganze Zahlen, dann

    principle * integerPercentage / 100
    

    , die alle Integer-Arithmetik verwendet, ist in der Regel schneller als sein Gleitkommazahlen Äquivalent (wahrscheinlich deutlich schneller im Falle eines Gleitkommatyp äquivalent zu T-SQL der decimal-Typ).

Andere Tipps

Wenn ihr ein Byte-Feld, dann dauert es weniger Platz in der db als Gleitkommazahlen, aber wenn man Millionen und Millionen von Datensätzen haben, werden Sie kaum einen Unterschied sehen.

Da Gleitkommawerte kann nicht für Gleichheit verglichen werden, eine ganze Zahl verwendet wurde, kann die SQL einfacher zu machen.

Zum Beispiel

(0.3==3*.1)

ist in der Regel falsch.

Allerdings

abs( 0.3 - 3*.1 )

Ist eine winzige Zahl (5.55e-17). Aber es ist Schmerz zu haben, alles mit (column-SomeValue) BETWEEN -0.0001 AND 0.0001 oder ABS(column-SomeValue) < 0.0001 zu tun. Sie würden lieber tun column = SomeValue in Ihrer WHERE-Klausel.

Gleitkommazahlen sind anfällig für Rundungsfehler und kann daher handeln „lustig“ in Vergleichen. Wenn Sie immer mit ihm als feste Dezimalzahl beschäftigen möchten, können Sie entweder eine Dezimalzahl Typ wählen, sagen dezimal (5,2), oder tun die convert und speichern als int, was Ihre db tut. Ich würde wahrscheinlich das Dezimalsystem Weg gehen, auch wenn der int weniger Platz in Anspruch nehmen würde.

Eine gute Vermutung ist, weil alles, was Sie mit ganzen Zahlen zu tun (Speicher, Berechnen, für einen Benutzer in eine Bearbeitungs Füllung, etc.) ist geringfügig leichter und effizienter als das gleiche mit Gleitkommazahlen zu tun. Und die Rundungsprobleme sind nicht so offensichtlich, wenn man sich die Daten zu suchen.

Wenn diese Zahlen sind die Benutzer wahrscheinlich am Ende zu sehen, und die Interaktion mit, Prozent sind leichter zu verstehen als Dezimalzahlen.

Dies ist eine jener Situationen, in denen eine Notation Hilfe helfen können; in dem Programm, bei der Verwendung eines Präfix (ungarische) oder Postfix konsistent Werte angeben, die Prozentsätze sind, die gegen jene decimal sind. Wenn Sie eine Namenskonvention erweitern, um die Datenbank selbst Felder, um so besser.

Und in den Datenspeicher Problem zu addieren, wenn Sie für Integer-Arithmetik verwenden können, was auch immer Sie tun, Verarbeitung, ist die Leistung viel besser, als wenn Gleitkomma-Arithmetik zu tun ... So ther percetages Speicherung als Integer-Werte der Verarbeitung zulassen Logik integer-Arithmetik itilize

Wenn Sie tatsächlich sie als Koeffizient (oder erwarten Benutzer der Datenbank diese Art der Sache in den Berichten zu tun) verwendet wird, gibt es einen Fall für sie als Koeffizienten-Speicher - vor allem, wenn es einen Grund gibt Berechnungen zu tun, mehr Beteiligung als eins ist.

Allerdings, wenn Sie dies tun, sollten Sie konsequent sein -. Entweder alle Prozentangaben oder alle Koeffizienten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top