Antworten:
Angenommen, Ihre Prozentsätze enthalten zwei Dezimalstellen. Der verwendete Datentyp hängt davon ab, wie Sie Ihre Prozentsätze speichern möchten. Wenn Sie ihr gebrochenes Äquivalent speichern möchten (z. B. 100,00% als 1,0000 gespeichert), würde ich die Daten in einem decimal(5,4)
Datentyp mit einer CHECK
Einschränkung speichern, die sicherstellt, dass die Werte niemals 1,0000 überschreiten (vorausgesetzt, dies ist die Obergrenze) und niemals unter 0 fallen (vorausgesetzt, das ist der Boden). Wenn Sie ihren Nennwert speichern möchten (z. B. 100,00% werden als 100,00 gespeichert), sollten Sie ihn decimal(5,2)
mit einer geeigneten CHECK
Einschränkung verwenden. In Kombination mit einem guten Spaltennamen wird anderen Entwicklern klar, was die Daten sind und wie die Daten in der Spalte gespeichert werden.
decimal(5,2)
dass 2 die Anzahl der Stellen nach dem Dezimaltrennzeichen bezeichnet?
decimal(5,2)
ist das, was mit einer Prüfbedingung erfasst werden sollte.
decimal(5,4)
und decimal(5,2)
nach dem obigen Kommentar geändert wurde ... Ich denke, dies decimal(5,4)
wäre die bessere Definition - dh Sie möchten 0 bis 1 mit 2 Dezimalstellen speichern, nicht 0 bis 100. Der Grund, warum ein Prozentsatz angegeben ist, liegt außerhalb von 100; 100% ist also 100/100, was 1 ist. In den meisten Fällen ist es sinnvoller, dies auf diese Weise zu tun (z. B. 100% * 100% = 100%
nicht 10000%
; 1 * 1 = 1
).
100.00
), müssen Sie decimal(5,2)
. Wenn die Werte als Brüche gespeichert werden sollen (z. B. 1.0000
), müssen Sie decimal(5,4)
. Wird den Beitrag aktualisieren.
decimal
.columnName decimal(precision, scale)
. Die Genauigkeit gibt die Gesamtzahl der Ziffern an, die in der Zahl enthalten sein können. Die Skalierung gibt an, wie viele davon nach der Dezimalstelle stehen, also decimal(3,2)
eine Zahl, die dargestellt werden kann wie #.##
; decimal(5,3)
wäre##.###
. decimal
und numeric
sind im Wesentlichen das gleiche. Ist decimal
jedoch ANSI-konform, verwenden Sie dies immer, sofern nicht anders angegeben (z. B. durch die Codierungsstandards Ihres Unternehmens).Beispielszenarien
decimal(5,4)
.decimal(3,2)
.Beispiel:
if object_id('Demo') is null
create table Demo
(
Id bigint not null identity(1,1) constraint pk_Demo primary key
, Name nvarchar(256) not null constraint uk_Demo unique
, SomePercentValue decimal(3,2) constraint chk_Demo_SomePercentValue check (SomePercentValue between 0 and 1)
, SomePrecisionPercentValue decimal(5,2) constraint chk_Demo_SomePrecisionPercentValue check (SomePrecisionPercentValue between 0 and 1)
)
Weiterführende Literatur:
0 to 1
vs 0 to 100
: C #: Speichern von Prozentsätzen, 50 oder 0,50?Ich stimme Thomas zu und würde die DECIMAL (5,4) -Lösung zumindest für WPF-Anwendungen wählen.
In der MSDN Numeric Format String erfahren Sie, warum: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
Der Prozentbezeichner ("P") multipliziert eine Zahl mit 100 und konvertiert sie in eine Zeichenfolge, die einen Prozentsatz darstellt.
Dann können Sie dies in Ihrem XAML-Code verwenden:
DataFormatString="{}{0:P}"
Wenn 2 Dezimalstellen Ihre Genauigkeit sind, würde ein "smallint" dies auf kleinstem Raum (2 Bytes) verarbeiten. Sie speichern den Prozentsatz multipliziert mit 100.
EDIT: Der Dezimaltyp passt wahrscheinlich besser zusammen. Dann müssen Sie nicht manuell skalieren. Es dauert 5 Bytes pro Wert.
Verwenden Sie numerisch (n, n), wobei n eine ausreichende Auflösung hat, um auf 1,00 zu runden. Zum Beispiel:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)