ประเภทข้อมูลที่เหมาะสมสำหรับการเก็บค่าเปอร์เซ็นต์?


112

ประเภทข้อมูลที่ดีที่สุดสำหรับการเก็บค่าเปอร์เซ็นต์ตั้งแต่ 0.00% ถึง 100.00% คืออะไร


พบโพสต์ที่เกี่ยวข้องนี้ด้วย: stackoverflow.com/questions/1602318/…
ผู้ใช้

คำตอบ:


132

สมมติว่ามีทศนิยมสองตำแหน่งในเปอร์เซ็นต์ของคุณประเภทข้อมูลที่คุณใช้ขึ้นอยู่กับว่าคุณวางแผนจะจัดเก็บเปอร์เซ็นต์ของคุณอย่างไร หากคุณกำลังจะจัดเก็บการเทียบเท่าเศษส่วน (เช่น 100.00% เก็บไว้ที่ 1.0000) ฉันจะจัดเก็บข้อมูลในdecimal(5,4)ประเภทข้อมูลโดยมีCHECKข้อ จำกัด ที่ทำให้แน่ใจได้ว่าค่าจะไม่เกิน 1.0000 (สมมติว่าเป็นค่าสูงสุด) และไม่เคยต่ำกว่า 0 (สมมติว่าเป็นพื้น). หากคุณกำลังจะจัดเก็บมูลค่าที่ตราไว้ (เช่น 100.00% จัดเก็บเป็น 100.00) คุณควรใช้decimal(5,2)ด้วยCHECKข้อ จำกัดที่เหมาะสม เมื่อรวมกับชื่อคอลัมน์ที่ดีทำให้นักพัฒนาคนอื่น ๆ เข้าใจได้อย่างชัดเจนว่าข้อมูลคืออะไรและจัดเก็บข้อมูลในคอลัมน์อย่างไร


12
ควรเป็นdecimal(5,2)ที่ 2 หมายถึงจำนวนหลักหลังตัวคั่นทศนิยมไม่ใช่หรือ?
Boris Callens

2
@BorisCallens - ไม่อยากจะเชื่อเลยว่าฉันพลาดทุกปีที่ผ่านมา ใช่นั่นเป็นการพิมพ์ผิด decimal(5,2)คือสิ่งที่ควรจับด้วยข้อ จำกัด ในการตรวจสอบ
โทมัส

4
ฉันคิดว่าสิ่งนี้เดิมมีdecimal(5,4)และเปลี่ยนเป็นdecimal(5,2)หลังจากความคิดเห็นด้านบน ... ฉันคิดว่าdecimal(5,4)น่าจะเป็นคำจำกัดความที่ดีกว่านั่นคือคุณต้องการจัดเก็บ 0 ถึง 1 โดยมีทศนิยม 2 ตำแหน่งไม่ใช่ 0 ถึง 100 เหตุผลที่เป็นเปอร์เซ็นต์ไม่อยู่ใน 100; ดังนั้น 100% จึงเป็น 100/100 ซึ่งก็คือ 1 การทำแบบนี้จะเข้าท่ากว่าสำหรับกรณีส่วนใหญ่ (เช่น100% * 100% = 100%ไม่ใช่10000%; 1 * 1 = 1)
JohnLBevan

4
@JohnLBevan - ใช้จ่ายในการจัดเก็บข้อมูล ถ้าค่าจะถูกเก็บไว้เป็นที่แสดง (เช่น100.00) decimal(5,2)แล้วคุณจะต้อง ถ้าค่าจะถูกเก็บไว้เป็นเศษส่วน (เช่น1.0000) decimal(5,4)แล้วคุณจะต้อง จะมาอัพเดทกระทู้.
โทมัส

ใครช่วยอธิบายได้ไหมว่าทำไมต้องมีทศนิยม 4 ตำแหน่ง คุณไม่สามารถใช้ 2? ถูกใจ. 91 === 91% หรือ 1.00 === 100%. ตอนนี้ฉันกำลังดำเนินการอยู่และสงสัยว่าจะได้รับ 4 ที่ บางอย่างเช่น Pct decimal (10, 2) CHECK (Pct> =. 01 AND Pct <= 1) ขอบคุณล่วงหน้า.
MH

31
  • ถือเป็นไฟล์decimal.
  • เพิ่มข้อ จำกัด ในการตรวจสอบหากคุณต้องการ จำกัด ช่วง (เช่นระหว่าง 0 ถึง 100% ในบางกรณีอาจมีเหตุผลที่ถูกต้องที่จะเกิน 100% หรืออาจเป็นเชิงลบด้วยซ้ำ)
  • รักษาค่า 1 เป็น 100%, 0.5 เป็น 50% เป็นต้นซึ่งจะช่วยให้การคำนวณทางคณิตศาสตร์ทำงานได้ตามที่คาดไว้ (เช่นเมื่อเทียบกับการใช้ค่า 100 เป็น 100%)
  • แก้ไขความแม่นยำและมาตราส่วนตามต้องการ (เป็นค่าสองค่าในวงเล็บcolumnName decimal(precision, scale)Precision บอกจำนวนหลักทั้งหมดที่สามารถถือเป็นตัวเลขได้สเกลบอกจำนวนตัวเลขที่อยู่หลังตำแหน่งทศนิยมดังนั้นจึงdecimal(3,2)เป็นตัวเลขที่สามารถแสดงได้ เป็น#.##; จะเป็น decimal(5,3)##.###
  • decimalและnumericโดยพื้นฐานแล้วเป็นสิ่งเดียวกัน อย่างไรก็ตามdecimalเป็นไปตามมาตรฐาน ANSI ดังนั้นควรใช้สิ่งนั้นเสมอเว้นแต่จะบอกไว้เป็นอย่างอื่น (เช่นตามมาตรฐานการเข้ารหัสของ บริษัท ของคุณ)

ตัวอย่างสถานการณ์

  • สำหรับกรณีของคุณ (0.00% มาอยู่ที่ 100.00%) decimal(5,4)ที่คุณต้องการ
  • สำหรับกรณีที่พบมากที่สุด (0% ถึง 100%) decimal(3,2)ที่คุณต้องการ
  • ทั้งสองข้อข้างต้นข้อ จำกัด ในการตรวจสอบจะเหมือนกัน

ตัวอย่าง:

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)
    )

อ่านเพิ่มเติม:


4

ฉันเห็นด้วยกับ Thomas และฉันจะเลือกโซลูชัน DECIMAL (5,4) อย่างน้อยสำหรับแอปพลิเคชัน WPF

ดูที่ MSDN Numeric Format String เพื่อทราบสาเหตุ: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString

ตัวระบุรูปแบบเปอร์เซ็นต์ ("P") จะคูณตัวเลขด้วย 100 และแปลงเป็นสตริงที่แสดงถึงเปอร์เซ็นต์

จากนั้นคุณจะสามารถใช้สิ่งนี้ในรหัส XAML ของคุณ:

DataFormatString="{}{0:P}"

2

หากทศนิยม 2 ตำแหน่งคือระดับความแม่นยำของคุณ "smallint" จะจัดการสิ่งนี้ในพื้นที่ที่เล็กที่สุด (2 ไบต์) คุณเก็บเปอร์เซ็นต์คูณด้วย 100

แก้ไข: ประเภททศนิยมน่าจะเข้ากันได้ดีกว่า จากนั้นคุณไม่จำเป็นต้องปรับขนาดด้วยตนเอง ใช้เวลา 5 ไบต์ต่อค่า


ไมโครซอฟท์พังหลายลิงค์ .....
pcnate

0

ใช้ตัวเลข (n, n) โดยที่ n มีความละเอียดเพียงพอที่จะปัดเศษเป็น 1.00 ตัวอย่างเช่น:

declare @discount numeric(9,9)
    , @quantity int
select @discount = 0.999999999
    , @quantity = 10000

select convert(money, @discount * @quantity)

3
คำถามนี้มีคำตอบที่ได้รับการยอมรับในระดับสูงพอสมควรเมื่อสามปีก่อน หากคุณกำลังมองหาคำถามเก่า ๆ เพื่อตอบโปรดดูที่นี่: stackoverflow.com/unanshed
valverij
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.