เมื่อใดจึงควรใช้ทศนิยมทศนิยมเทียบกับ


14

ฉันกำลังสร้าง API นี้และฐานข้อมูลจะเก็บค่าที่เป็นหนึ่งในค่าต่อไปนี้:

  • ร้อยละ
  • เฉลี่ย
  • ประเมินค่า

ฉันไม่รู้จะนำเสนอบางสิ่งบางอย่างว่าช่วงอยู่ระหว่าง 0 ถึง 100% ในตัวเลข มันควรจะเป็น

  • 0.00 - 1.00
  • 0.00 - 100.00
  • ทางเลือกอื่นใดที่ฉันไม่รู้

มีตัวเลือกที่ชัดเจนสำหรับสิ่งนั้นหรือไม่? วิธีทั่วโลกในการแสดงบนฐานข้อมูลบางอย่างที่เปลี่ยนจาก 0 ถึง 100% เปอร์เซ็นต์? จะไปต่อไปประเภทที่ถูกต้องคืออะไรมันลอยหรือทศนิยม?

ขอบคุณ.



5
ตัวเลขอาจถูกเก็บไว้ได้หลายวิธี ไม่มีอะไรผิดปกติอย่างใดอย่างหนึ่งกับการจัดเก็บเปอร์เซ็นต์โดยใช้ 0-100 หรือใช้ 0-1 สิ่งสำคัญคือสิ่งที่คุณต้องทำกับตัวเลขความแม่นยำที่คุณต้องการและอื่น ๆ คุณต้องอธิบายบริบทเพิ่มเติมก่อนจึงจะสามารถให้คำตอบที่ดีได้ คุณต้องการเก็บหมายเลขที่สามารถแทนได้ด้วยตัวเลขทศนิยมจำนวนเล็กน้อยหรือไม่? ถ้าคุณเฉลี่ยสิ่งต่าง ๆ คุณจะได้เศษส่วนเหมือนหนึ่งในสามหรือเจ็ด คุณต้องการจัดเก็บสิ่งเหล่านั้นหรือไม่ หรือแค่ประมาณ? ประมาณเท่าไหร่ คุณจะทำอะไรกับพวกเขา
Eric Postpischil

1
หากค่าเป็น 0.00 ถึง 100.00 ในขั้นตอนที่ 0.01 นั่นคือ 1,0001 ค่าที่แตกต่าง เพียงใช้เครื่องหมายintเพื่อแทนค่าร้อยหรือหน่วยPermyriadหรือ‱
chux - Reinstate Monica

@ chux-ReinstateMonica - ใช่ "จำนวนเต็มที่ปรับขนาด" เป็นไปได้ แต่เงอะงะ
Rick James

@ RickJames บางที ฉันไม่พบจำนวนเต็มที่ปรับสัดส่วนยาก
chux - Reinstate Monica

คำตอบ:


4

ฉันจะใช้ท่าทางตรงข้าม

FLOATสำหรับตัวเลขโดยประมาณเช่นเปอร์เซ็นต์ค่าเฉลี่ยเป็นต้นคุณควรทำการฟอร์แมตเมื่อคุณแสดงค่าทั้งในรหัสแอพหรือใช้FORMAT()ฟังก์ชั่นของ MySQL

ไม่เคยทดสอบfloat_value = 1.3; มีสาเหตุหลายประการที่จะล้มเหลว

DECIMALควรใช้สำหรับค่าเงิน DECIMALหลีกเลี่ยงการปัดเศษครั้งที่สองเมื่อค่าต้องถูกปัดเศษเป็นดอลลาร์ / เซนต์ / ยูโร / ฯลฯ นักบัญชีไม่ชอบเศษของเซนต์

การติดตั้งใช้งานของ MySQL DECIMALอนุญาตให้มี 65 หลักสำคัญ; FLOATให้ประมาณ 7 และDOUBLEประมาณ 16 7 มักจะเกินพอสำหรับเซ็นเซอร์และการคำนวณทางวิทยาศาสตร์

สำหรับ "เปอร์เซนต์" - บางครั้งฉันก็ใช้TINYINT UNSIGNEDเมื่อฉันต้องการใช้พื้นที่จัดเก็บเพียง 1 ไบต์และไม่ต้องการความแม่นยำมากนัก บางครั้งฉันเคยใช้FLOAT(4 ไบต์) ไม่มีการปรับประเภทข้อมูลเป็นเปอร์เซ็นต์ (หมายเหตุด้วยที่DECIMAL(2,0)ไม่สามารถเก็บค่า100ได้ดังนั้นคุณจำเป็นต้องมีเทคนิคDECIMAL(3,0))

หรือบางครั้งฉันได้ใช้ค่าFLOATที่มีค่าอยู่ระหว่าง 0 ถึง 1 แต่จากนั้นฉันต้องตรวจสอบให้แน่ใจว่าคูณด้วย 100 ก่อนที่จะแสดง "เปอร์เซ็นต์"

มากกว่า

ทั้งสามของ "เปอร์เซ็นต์, เฉลี่ย, อัตรา" กลิ่นเหมือนลอยดังนั้นนั่นจะเป็นตัวเลือกแรกของฉัน

เกณฑ์หนึ่งสำหรับการตัดสินใจเลือกประเภทข้อมูล ... จะมีสำเนาของค่ากี่ชุด?

หากคุณมีตารางพันล้านแถวที่มีคอลัมน์คิดเป็นเปอร์เซ็นต์ให้พิจารณาว่าTINYINTจะมีขนาด 1 ไบต์ (ทั้งหมด 1GB) แต่FLOATจะมีขนาด 4 ไบต์ (รวม 4GB) OTOH แอปพลิเคชันส่วนใหญ่ไม่มีแถวจำนวนมากดังนั้นสิ่งนี้อาจไม่เกี่ยวข้อง

ตามกฎ 'ทั่วไป' "แน่นอน" คุณค่าควรใช้รูปแบบของบางส่วนหรือINT DECIMALสิ่งที่ไม่แน่นอน (การคำนวณทางวิทยาศาสตร์รากที่สองการหาร ฯลฯ ) ควรใช้FLOAT(หรือDOUBLE)

นอกจากนี้การจัดรูปแบบของผลลัพธ์มักจะถูกทิ้งไว้ที่ส่วนหน้าของแอปพลิเคชัน นั่นคือแม้ว่า "เฉลี่ย" อาจคำนวณเป็น "14.6666666 ... " จอแสดงผลควรแสดงบางอย่างเช่น "14.7"; นี่เป็นมิตรต่อมนุษย์ ในขณะเดียวกันคุณมีค่าอ้างอิงเพื่อตัดสินใจในภายหลังว่า "15" หรือ "14.667" เป็นรูปแบบเอาต์พุตที่นิยม

ช่วง "0.00 - 100.00" สามารถทำได้ด้วยFLOAT และใช้การจัดรูปแบบเอาต์พุตหรือDECIMAL(5,2)(3 ไบต์) ด้วยการกำหนดล่วงหน้าที่คุณจะต้องการความแม่นยำที่ระบุไว้เสมอ


3

floatฉันมักจะแนะนำให้ใช้ ตัวเลขจุดลอยตัวแสดงถึงตัวเลขใน base-2 ซึ่งทำให้ตัวเลข (แน่นอน) จำนวนหนึ่งถูกปัดเศษขึ้นในการดำเนินการหรือการเปรียบเทียบเพราะตัวเลขเหล่านั้นไม่สามารถจัดเก็บอย่างถูกต้องในฐาน -2 สิ่งนี้อาจนำไปสู่พฤติกรรมที่น่าแปลกใจ

ลองพิจารณาตัวอย่างต่อไปนี้ :

create table t (num float);
insert into t values(1.3);

select * from t;

| num |
| --: |
| 1.3 |

select * from t where num = 1.3;

| num |
| --: |

Base-2 การเปรียบเทียบตัวเลข1.3ล้มเหลว นี่เป็นเรื่องยุ่งยาก

ในการเปรียบเทียบทศนิยมให้การแสดงที่ถูกต้องของตัวเลข จำกัด ภายในช่วงของพวกเขา ถ้าคุณเปลี่ยนfloatไปdecimal(2, 1)ในตัวอย่างข้างต้นคุณจะได้รับผลที่คาดหวัง


4
คำตอบนี้เป็นเท็จในหลาย ๆ เรื่อง “ ในการเปรียบเทียบทศนิยมจะมีช่วงที่เล็กกว่า แต่ให้การแทนจำนวนที่แน่นอนภายในขอบเขตนั้น” เป็นเท็จ: ทศนิยมไม่ได้แทน⅓อย่างแน่นอน “ บางหมายเลข (แน่นอน, จำกัด ) ตัวเลขปัดเศษ "ไม่ถูกต้อง; ตัวเลขไม่ใช่“ การปัดเศษขึ้น” การแปลงและการดำเนินการอื่น ๆ อาจปัดเศษ โหมดการปัดเศษที่เป็นค่าเริ่มต้นโดยทั่วไปมักจะเป็นแบบใกล้เคียงที่สุดเสมอ
Eric Postpischil

4
ปัญหาที่มีความแม่นยำไม่ได้เกิดจาก“ ตัวเลขจุดลอยตัว” แต่เกิดจากการใช้ตัวเลข: การแทนตัวเลขที่แน่นอนทั้งหมดมีความแม่นยำ จำกัด : จุดลอยตัว, จุดคงที่, จำนวนเต็ม, เหตุผล, ทศนิยม, ไบนารี, ทุกอย่าง
Eric Postpischil

2
ถอนหายใจ คุณแก้ไขอะไร ความคิดเห็นของฉันบอกว่าคำตอบนั้นไม่ถูกต้องเพราะมันบอกว่าทศนิยมให้การแทนตัวเลขที่แน่นอนภายในช่วงของมัน การเปลี่ยนแปลงบอกว่า "ถูกต้อง" แทนที่จะเป็น "แน่นอน" แต่แล้วทำไมไม่ใช่เลขทศนิยมแบบเลขฐานสองก็ดี - ไม่ถูกต้องสำหรับ and และทั้งสองหรือไม่เที่ยงตรงขึ้นอยู่กับว่าเกณฑ์ของคุณแม่นยำแค่ไหนและแม่นยำเท่าใด พวกเขามี. คำถามบ่งบอกว่าค่าเฉลี่ยจะถูกนำเสนอและค่าเฉลี่ยสามสิ่งที่ทำให้คุณมีตัวเลขเช่น⅓
Eric Postpischil

4
ความคิดเห็นบอกว่าใช้กันมากที่สุดรอบ - ต่อ - ใกล้ - ถึง - ที่สุด แต่คำตอบก็ยังบอกว่า - ขึ้น คำตอบบอกว่าการเปรียบเทียบอาจปัดเศษขึ้น แต่การเปรียบเทียบนั้นสมบูรณ์แบบ: การเปรียบเทียบจะส่งคืนผลลัพธ์ที่ถูกต้องทางคณิตศาสตร์เสมอโดยไม่มีการปัดเศษ (ภาษาการเขียนโปรแกรมบางภาษาอาจแปลงตัวถูกดำเนินการก่อนเปรียบเทียบ แต่เป็นภาษาที่ดำเนินการแยกต่างหาก)
Eric Postpischil

1
1/3 ไม่สามารถว่าเป็นตัวแทนทั้งในไบนารีหรือทศนิยม ส่วนลด 20% จาก $ 14.99 จะต้องไม่มีการปัดเศษเศษส่วนการปัดเศษ
ริคเจมส์

0

ความแตกต่างระหว่างทศนิยมและทศนิยมคือความแม่นยำ ทศนิยมสามารถแสดงตัวเลขได้อย่างแม่นยำ 100% ภายในความแม่นยำของรูปแบบทศนิยมขณะที่ Float ไม่สามารถแสดงตัวเลขทั้งหมดได้อย่างถูกต้อง

ใช้ทศนิยมสำหรับเช่นค่าที่เกี่ยวข้องกับการเงินและใช้ทศนิยมเช่นค่าที่เกี่ยวข้องกับกราฟิก


0

ฉันขอแนะนำให้ใช้decimal(5,2)ถ้าคุณกำลังจะเก็บมันในแบบเดียวกับที่คุณแสดงเพราะมันdecimalเป็นการรักษาความแม่นยำที่แน่นอน (ดูhttps://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html )

เนื่องจากค่าจุดลอยตัวเป็นค่าประมาณและไม่ได้เก็บไว้เป็นค่าที่แน่นอนความพยายามที่จะปฏิบัติต่อพวกเขาอย่างแม่นยำในการเปรียบเทียบอาจนำไปสู่ปัญหา พวกเขายังขึ้นอยู่กับการพึ่งพาแพลตฟอร์มหรือการใช้งาน

( https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html )

ค่า floating-point ตามที่เขียนในคำสั่ง SQL อาจไม่เหมือนกันกับค่าที่แสดงภายใน

สำหรับคอลัมน์ DECIMAL, MySQL ทำการดำเนินการด้วยความแม่นยำของตัวเลข 65 หลักซึ่งควรแก้ปัญหาความไม่ถูกต้องที่พบบ่อยที่สุด

https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html


0

ทศนิยม: ในกรณีของแอปพลิเคชันทางการเงินจะดีกว่าที่จะใช้ประเภททศนิยมเนื่องจากให้ความแม่นยำระดับสูงและง่ายต่อการหลีกเลี่ยงข้อผิดพลาดในการปัดเศษ

สองครั้ง: ประเภทสองเท่าอาจเป็นประเภทข้อมูลที่ใช้กันมากที่สุดตามมูลค่าจริงยกเว้นการจัดการเงิน

โฟลต: ส่วนใหญ่จะใช้ในห้องสมุดกราฟิกเพราะความต้องการพลังการประมวลผลสูงมากและยังใช้สถานการณ์ที่สามารถทนต่อข้อผิดพลาดในการปัดเศษ

การอ้างอิง: http://net-informations.com/q/faq/float.html


0
mysql> create table numbers (a decimal(10,2), b float);
mysql> insert into numbers values (100, 100);
mysql> select @a := (a/3), @b := (b/3), @a * 3, @b * 3 from numbers \G

*********************************************************************

@a := (a/3): 33.333333333
@b := (b/3): 33.333333333333
@a + @a + @a: 99.999999999000000000000000000000
@b + @b + @b: 100

ทศนิยมทำในสิ่งที่ควรทำในกรณีนี้มันตัดส่วนที่เหลือออกไปดังนั้นจึงสูญเสียส่วนที่ 1/3

ดังนั้นสำหรับผลรวมเลขทศนิยมจะดีกว่า แต่สำหรับหน่วยงานทศนิยมจะดีกว่าจนถึงบางจุดแน่นอน ฉันหมายถึงการใช้ DECIMAL จะไม่ให้ "เลขคณิตที่ไม่ผ่านการพิสูจน์" ให้คุณไม่ว่าในกรณีใด ๆ

ฉันหวังว่านี่จะช่วยได้


0

ใน tsql: Float 0.0 เก็บเป็น 0 และไม่จำเป็นต้องกำหนดตามหลักทศนิยมเช่นคุณไม่จำเป็นต้องเขียน Float (4,2) ทศนิยม 0.0 เก็บเป็น 0.0 และมีตัวเลือกให้กำหนดเช่นทศนิยม (4,2) ฉันจะแนะนำ 0.00-1.00 โดยการทำเช่นนี้คุณสามารถคำนวณค่าของเปอร์เซ็นต์นั้นโดยไม่ต้องคูณด้วย 100 และถ้าคุณรายงานแล้วตั้งค่าชนิดข้อมูล คอลัมน์ที่เป็นร้อยละ MS Excel และดูแพลตฟอร์มอื่น ๆ 0.5 -> 50%เช่น

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