อะไรคือความแตกต่างระหว่างdecimal, floatและdoubleใน .NET?
เมื่อไหร่จะมีคนใช้อย่างใดอย่างหนึ่งเหล่านี้?
อะไรคือความแตกต่างระหว่างdecimal, floatและdoubleใน .NET?
เมื่อไหร่จะมีคนใช้อย่างใดอย่างหนึ่งเหล่านี้?
คำตอบ:
floatและdoubleจะลอยไบนารีประเภทจุด กล่าวอีกนัยหนึ่งมันเป็นตัวแทนของตัวเลขเช่นนี้:
10001.10010110011
หมายเลขไบนารี่และตำแหน่งของจุดไบนารี่ถูกเข้ารหัสทั้งคู่ภายในค่า
decimalเป็นลอยทศนิยมชนิดจุด กล่าวอีกนัยหนึ่งมันเป็นตัวแทนของตัวเลขเช่นนี้:
12345.65789
อีกครั้งหมายเลขและที่ตั้งของจุดทศนิยมจะถูกเข้ารหัสภายในค่านั่นคือสิ่งที่ทำให้decimalยังคงเป็นประเภทจุดลอยแทนประเภทจุดคงที่
สิ่งสำคัญที่ควรทราบคือมนุษย์จะใช้เพื่อเป็นตัวแทนที่ไม่ใช่จำนวนเต็มในรูปแบบทศนิยมและคาดหวังผลลัพธ์ที่แน่นอนในการเป็นตัวแทนทศนิยม; ไม่ใช่ทศนิยมทั้งหมดที่สามารถแทนได้ในทศนิยมทศนิยมเช่น - 0.1 ดังนั้นถ้าคุณใช้ค่าทศนิยมลอยตัวไบนารีคุณจะได้ค่าประมาณ 0.1 คุณจะยังคงได้รับการประมาณเมื่อใช้ทศนิยมทศนิยมเช่นกัน - ผลลัพธ์ของการหาร 1 ด้วย 3 ไม่สามารถแสดงได้อย่างแน่นอน
เป็นสิ่งที่จะใช้เมื่อ:
สำหรับค่าซึ่งเป็น "ธรรมชาติที่แน่นอนทศนิยม" decimalมันเป็นเรื่องดีที่จะใช้ สิ่งนี้มักจะเหมาะสำหรับแนวคิดใด ๆ ที่มนุษย์คิดค้นขึ้นมา: คุณค่าทางการเงินเป็นตัวอย่างที่ชัดเจนที่สุด พิจารณาคะแนนที่ให้กับนักดำน้ำหรือนักสเก็ตน้ำแข็ง
สำหรับค่าซึ่งเป็นสิ่งประดิษฐ์อื่น ๆ จากธรรมชาติที่ไม่สามารถวัดได้จริงๆว่าแล้วfloat/ doubleมีความเหมาะสมมากขึ้น ตัวอย่างเช่นข้อมูลทางวิทยาศาสตร์มักจะแสดงในรูปแบบนี้ ที่นี่ค่าดั้งเดิมจะไม่ "ถูกต้องทางทศนิยม" ในการเริ่มต้นดังนั้นจึงไม่สำคัญสำหรับผลลัพธ์ที่คาดหวังในการรักษา "ความแม่นยำทศนิยม" ชนิดจุดลอยตัวแบบไบนารีนั้นทำงานได้เร็วกว่าทศนิยม
float/ doubleมักจะไม่แสดงตัวเลขเป็น101.101110ปกติมันจะแสดงเป็นสิ่งที่ชอบ1101010 * 2^(01010010)- ตัวแทน
floatเป็นคำหลัก C # และไม่ใช่ประเภท. Net มันSystem.Single.. singleและdoubleเป็นประเภทเลขฐานสองแบบลอยตัว
ความแม่นยำเป็นความแตกต่างหลัก
Float - 7 หลัก (32 บิต)
ดับเบิล -15-16 หลัก (64 บิต)
ทศนิยมที่สำคัญ -28-29 หลัก (128 บิต)
ทศนิยมมีความแม่นยำสูงกว่ามากและมักใช้ในแอปพลิเคชันทางการเงินที่ต้องการความแม่นยำระดับสูง ทศนิยมนั้นช้ากว่ามาก (มากถึง 20 เท่าในการทดสอบบางอย่าง) กว่าแบบ double / float
Decimals and Floats / Doubles ไม่สามารถเปรียบเทียบได้โดยไม่ต้องใช้ cast ในขณะที่ Float และ Doubles สามารถทำได้ ทศนิยมยังอนุญาตให้มีการเข้ารหัสหรือต่อท้ายเลขศูนย์
float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);
ผลลัพธ์ :
float: 0.3333333
double: 0.333333333333333
decimal: 0.3333333333333333333333333333
0.1 - นั่นไม่ค่อยเป็นเรื่องจริงในโลกแห่งความเป็นจริง! รูปแบบการจัดเก็บข้อมูลใด ๆ ที่จำกัด จะทำให้จำนวนของค่าที่เป็นไปได้ไม่สิ้นสุดเท่ากับจำนวนของรูปแบบบิตที่ จำกัด ยกตัวอย่างเช่นfloatจะ conflate 0.1และ0.1 + 1e-8ในขณะที่decimalจะ conflate และ0.1 0.1 + 1e-29แน่นอนว่าภายในช่วงที่กำหนดค่าบางอย่างสามารถแสดงในรูปแบบใดก็ได้โดยไม่มีการสูญเสียความถูกต้องเป็นศูนย์ (เช่นfloatสามารถเก็บจำนวนเต็มใด ๆ ได้ถึง 1.6e7 โดยไม่มีการสูญเสียความแม่นยำเป็นศูนย์) - แต่นั่นก็ยังไม่มีความแม่นยำไม่สิ้นสุด
0.1คือไม่ได้เป็นค่าพิเศษ ! มีเพียงสิ่งเดียวที่ทำให้0.1"ดี" กว่า0.10000001เป็นเพราะมนุษย์ชอบฐาน 10 และแม้จะมีfloatค่าถ้าคุณเริ่มต้นสองค่าที่มี0.1ลักษณะเดียวกับที่พวกเขาทั้งสองจะเป็นค่าเดียวกัน มันเป็นเพียงว่าคุ้มค่าที่จะไม่เป็นว่า 0.1 - มันจะมีค่าใกล้เคียงกับ0.1floatที่สามารถแสดงว่าเป็น แน่นอนด้วยไบนารีลอย(1.0 / 10) * 10 != 1.0แต่ด้วยทศนิยมลอย(1.0 / 3) * 3 != 1.0ทั้ง ทั้งเป็นทำเลที่ดีเลิศได้อย่างแม่นยำ
double a = 0.1; double b = 0.1;แล้วจะเป็นจริงa == b มันเป็นแค่ที่aและbจะทั้งสอง0.1ไม่ได้ว่าเท่ากับ ใน C # ถ้าคุณทำเช่นdecimal a = 1.0m / 3.0m; decimal b = 1.0m / 3.0m;นั้นa == bจะเป็นจริงเช่นกัน แต่ในกรณีที่ค่าของaหรือbจะว่าเท่ากับ1/3- 0.3333...พวกเขาทั้งสองจะเท่ากับ ในทั้งสองกรณีความแม่นยำบางอย่างหายไปเนื่องจากการเป็นตัวแทน คุณหัวชนฝาบอกว่าdecimalมีความแม่นยำ "อนันต์" ซึ่งเป็นเท็จ
โครงสร้างทศนิยมได้รับการมุ่งเน้นอย่างเคร่งครัดเพื่อการคำนวณทางการเงินที่ต้องการความแม่นยำซึ่งค่อนข้างไม่ทนต่อการปัดเศษ ทศนิยมไม่เพียงพอสำหรับการใช้งานทางวิทยาศาสตร์อย่างไรก็ตามด้วยเหตุผลหลายประการ:
+---------+----------------+---------+----------+---------------------------------------------+
| C# | .Net Framework | Signed? | Bytes | Possible Values |
| Type | (System) type | | Occupied | |
+---------+----------------+---------+----------+---------------------------------------------+
| sbyte | System.Sbyte | Yes | 1 | -128 to 127 |
| short | System.Int16 | Yes | 2 | -32768 to 32767 |
| int | System.Int32 | Yes | 4 | -2147483648 to 2147483647 |
| long | System.Int64 | Yes | 8 | -9223372036854775808 to 9223372036854775807 |
| byte | System.Byte | No | 1 | 0 to 255 |
| ushort | System.Uint16 | No | 2 | 0 to 65535 |
| uint | System.UInt32 | No | 4 | 0 to 4294967295 |
| ulong | System.Uint64 | No | 8 | 0 to 18446744073709551615 |
| float | System.Single | Yes | 4 | Approximately ±1.5 x 10-45 to ±3.4 x 1038 |
| | | | | with 7 significant figures |
| double | System.Double | Yes | 8 | Approximately ±5.0 x 10-324 to ±1.7 x 10308 |
| | | | | with 15 or 16 significant figures |
| decimal | System.Decimal | Yes | 12 | Approximately ±1.0 x 10-28 to ±7.9 x 1028 |
| | | | | with 28 or 29 significant figures |
| char | System.Char | N/A | 2 | Any Unicode character (16 bit) |
| bool | System.Boolean | N/A | 1 / 2 | true or false |
+---------+----------------+---------+----------+---------------------------------------------+
ฉันจะไม่ย้ำข้อมูลที่ดี (และไม่ดีบางส่วน) ตอบแล้วในคำตอบและความคิดเห็นอื่น ๆ แต่ฉันจะตอบคำถามติดตามของคุณด้วยเคล็ดลับ:
เมื่อไหร่จะมีคนใช้อย่างใดอย่างหนึ่งเหล่านี้?
ใช้ทศนิยมสำหรับค่าที่นับ
ใช้ float / double สำหรับค่าที่วัดได้
ตัวอย่างบางส่วน:
เงิน (เราจะนับเงินหรือวัดเงิน)
ระยะทาง (เรานับระยะทางหรือวัดระยะทางหรือไม่ *)
คะแนน (เราจะนับคะแนนหรือวัดคะแนนหรือไม่)
เรานับเงินอยู่เสมอและไม่ควรวัด เรามักจะวัดระยะทาง เรามักจะนับคะแนน
* ในบางกรณีสิ่งที่ฉันจะเรียกระยะทางที่ระบุเราอาจต้องการระยะทาง 'นับ' ตัวอย่างเช่นบางทีเรากำลังติดต่อกับสัญลักษณ์ของประเทศที่แสดงระยะทางไปยังเมืองต่างๆและเรารู้ว่าระยะทางเหล่านั้นไม่เคยมีทศนิยมมากกว่าหนึ่งหลัก (xxx.x km)
float ความแม่นยำ 7 หลัก
double มีความแม่นยำประมาณ 15 หลัก
decimal มีความแม่นยำประมาณ 28 หลัก
หากคุณต้องการความแม่นยำที่ดีกว่าให้ใช้ double แทน float ในซีพียูสมัยใหม่ทั้งสองประเภทข้อมูลมีประสิทธิภาพเกือบเหมือนกัน ประโยชน์เพียงอย่างเดียวของการใช้โฟลตคือพวกเขาใช้พื้นที่น้อยลง มีความสำคัญในทางปฏิบัติหากคุณมีหลายสิ่งเท่านั้น
ฉันพบว่าสิ่งนี้น่าสนใจ สิ่งที่นักวิทยาศาสตร์คอมพิวเตอร์ทุกคนควรรู้เกี่ยวกับเลขคณิตทศนิยม
doubleเหมาะสมในแอปพลิเคชั่นการบัญชีในกรณีเหล่านั้น (และโดยทั่วไปเป็นเพียงกรณีเหล่านั้น) ซึ่งไม่มีประเภทจำนวนเต็มมากกว่า 32 บิตพร้อมใช้งานและdoubleถูกใช้ราวกับเป็นประเภทเลข 53 บิต (เช่นถือ จำนวนเพนนีทั้งหมดหรือหนึ่งร้อยเปอร์เซ็นต์ ทุกวันนี้ไม่ค่อยใช้สิ่งเหล่านี้มากนัก แต่หลายภาษาได้รับความสามารถในการใช้ค่าทศนิยมที่มีความแม่นยำสองเท่านานก่อนที่พวกเขาจะได้คณิตศาสตร์ 64 บิต (หรือในบางกรณีแม้แต่คณิตศาสตร์ 32 บิต!)
RealIIRC นั้นสามารถแสดงค่าได้ถึง 1.8E + 19 ด้วยความแม่นยำของหน่วย ฉันจะคิดว่ามันจะมั่นคงมากสำหรับโปรแกรมบัญชีที่จะใช้Realเพื่อเป็นตัวแทนของจำนวนทั้งหมดของเพนนีกว่า ...
doubleประเภทที่มีความแม่นยำของหน่วยสูงถึง 9E15 หากต้องการเก็บตัวเลขทั้งหมดซึ่งใหญ่กว่าประเภทจำนวนเต็มที่ใหญ่ที่สุดการใช้doubleจะง่ายกว่าและมีประสิทธิภาพมากกว่าการพยายามคำนวณทางคณิตศาสตร์ที่มีความแม่นยำสูงโดยเฉพาะในขณะที่หน่วยประมวลผลมีคำสั่งให้ทำงาน 16x16-> 32 หรือ ..
ไม่มีใครพูดถึงเรื่องนี้
ในการตั้งค่าเริ่มต้น Floats (System.Single) และ doubles (System.Double) จะไม่ใช้การตรวจสอบโอเวอร์โฟลว์ในขณะที่ Decimal (System.Decimal) จะใช้การตรวจสอบโอเวอร์โฟลว์เสมอ
ฉันหมายถึง
decimal myNumber = decimal.MaxValue;
myNumber += 1;
พ่นOverflowException
แต่สิ่งเหล่านี้ไม่ได้:
float myNumber = float.MaxValue;
myNumber += 1;
&
double myNumber = double.MaxValue;
myNumber += 1;
float.MaxValue+1 == float.MaxValuedecimal.MaxValue+0.1D == decimal.MaxValueเช่นเดียวกับที่ บางทีคุณหมายถึงอะไรบางอย่างfloat.MaxValue*2?
System.Decimalโยนข้อยกเว้นก่อนที่มันจะไม่สามารถแยกความแตกต่างของหน่วยทั้งหมดได้ แต่ถ้าแอปพลิเคชันควรจะจัดการกับเช่นดอลลาร์และเซนต์นั่นอาจจะสายเกินไป
decimalด้วยศูนย์ (CS0020) และสิ่งเดียวกันนั้นเป็นจริงของตัวอักษรอินทิกรัล อย่างไรก็ตามหากค่าทศนิยมแบบรันไทม์หารด้วยศูนย์คุณจะได้รับข้อยกเว้นไม่ใช่ข้อผิดพลาดในการคอมไพล์
จำนวนเต็มตามที่กล่าวถึงคือจำนวนเต็ม พวกเขาไม่สามารถเก็บคะแนนบางอย่างเช่น. 7, .42 และ .007 หากคุณต้องการเก็บตัวเลขที่ไม่ใช่ตัวเลขทั้งหมดคุณต้องการตัวแปรชนิดอื่น คุณสามารถใช้ประเภทคู่หรือประเภทลอย คุณตั้งค่าเหล่านี้ประเภทของตัวแปรขึ้นมาในทางเดียวกันว่า: แทนการใช้คำว่าintคุณพิมพ์หรือdouble floatแบบนี้:
float myFloat;
double myDouble;
( floatสั้นสำหรับ "ทศนิยม" และหมายถึงตัวเลขที่มีบางสิ่งบางอย่างในจุดสิ้นสุด)
ความแตกต่างระหว่างสองคือขนาดของตัวเลขที่พวกเขาสามารถถือ สำหรับfloatคุณสามารถมีตัวเลขได้สูงสุด 7 หลัก สำหรับdoubles คุณสามารถมีได้สูงสุด 16 หลัก เพื่อให้แม่นยำยิ่งขึ้นนี่คือขนาดทางการ:
float: 1.5 × 10^-45 to 3.4 × 10^38
double: 5.0 × 10^-324 to 1.7 × 10^308
floatเป็นหมายเลข 32 บิตและdoubleเป็นหมายเลข 64 บิต
ดับเบิลคลิกที่ปุ่มใหม่ของคุณเพื่อรับรหัส เพิ่มสามบรรทัดต่อไปนี้ในรหัสปุ่มของคุณ:
double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());
หยุดโปรแกรมของคุณและกลับไปที่หน้าต่างการเข้ารหัส เปลี่ยนบรรทัดนี้:
myDouble = 0.007;
myDouble = 12345678.1234567;
เรียกใช้โปรแกรมของคุณแล้วคลิกปุ่มสองครั้งของคุณ กล่องข้อความแสดงตัวเลขอย่างถูกต้อง เพิ่มหมายเลขอื่นในท้ายที่สุดแล้วและ C # จะปัดขึ้นหรือลงอีกครั้ง คุณธรรมคือถ้าคุณต้องการความแม่นยำระวังการปัดเศษ!
decimalถูกจัดเก็บในรูปแบบทศนิยม (ตรงข้ามกับฐาน 2 ดังนั้นจะไม่สูญเสียหรือปัดเศษตัวเลขเนื่องจากการแปลงระหว่างระบบตัวเลขทั้งสอง) นอกจากนี้decimalไม่มีแนวคิดของค่าพิเศษเช่น NaN, -0, ∞หรือ-∞
นี่เป็นหัวข้อที่น่าสนใจสำหรับฉันในวันนี้เราเพิ่งมีข้อผิดพลาดเล็กน้อยที่น่ารังเกียจเกี่ยวกับdecimalการมีความแม่นยำน้อยกว่าfloatการมีความแม่นยำน้อยกว่า
ในรหัส C # ของเราเรากำลังอ่านค่าตัวเลขจากสเปรดชีท Excel แปลงเป็น a decimalแล้วส่งdecimalกลับไปยังบริการเพื่อบันทึกลงในฐานข้อมูลSQL Server
Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
decimal value = 0;
Decimal.TryParse(cellValue.ToString(), out value);
}
ทีนี้สำหรับค่า Excel ของเราเกือบทั้งหมดแล้วมันก็ใช้ได้ดี แต่สำหรับบางค่า Excel ที่มีขนาดเล็กมากการใช้ค่านั้นdecimal.TryParseหายไปโดยสิ้นเชิง ตัวอย่างหนึ่งคือ
cellValue = 0.00006317592
Decimal.TryParse (cellValue.ToString (), ค่าออก); // จะคืนค่า0
วิธีแก้ปัญหาที่แปลกประหลาดคือการแปลงค่าของ Excel ให้เป็นdoubleอันดับแรกจากนั้นให้เป็นdecimal:
Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
double valueDouble = 0;
double.TryParse(cellValue.ToString(), out valueDouble);
decimal value = (decimal) valueDouble;
…
}
แม้ว่าจะdoubleมีความแม่นยำน้อยกว่า a decimalจริง ๆ แล้วมั่นใจว่าตัวเลขขนาดเล็กจะยังคงรับรู้ ด้วยเหตุผลบางอย่างdouble.TryParseจริง ๆ แล้วสามารถดึงข้อมูลจำนวนน้อยเช่นนั้นในขณะที่decimal.TryParseจะตั้งค่าเป็นศูนย์
แปลก แปลกมาก.
decimal.Parse("0.00006317592")ผล - คุณมีอย่างอื่นเกิดขึ้น - สัญกรณ์ทางวิทยาศาสตร์ที่เป็นไปได้?
สำหรับแอปพลิเคชั่นเช่นเกมและระบบฝังตัวที่หน่วยความจำและประสิทธิภาพมีความสำคัญอย่างมากโฟลตมักเป็นตัวเลือกประเภทตัวเลขเนื่องจากมันเร็วกว่าและมีขนาดเท่าตัวครึ่งหนึ่ง จำนวนเต็มเคยเป็นอาวุธของตัวเลือก แต่ประสิทธิภาพของจุดลอยมีจำนวนเต็มในโปรเซสเซอร์ที่ทันสมัย ทศนิยมไม่ถูกต้อง!
ชนิดตัวแปรทศนิยมทศนิยมและลอยแตกต่างกันในวิธีการจัดเก็บค่า ความแม่นยำคือความแตกต่างหลักที่ลอยเป็นชนิดข้อมูลจุดลอยตัวความแม่นยำเดียว (32 บิต) double คือชนิดข้อมูลจุดลอยตัวที่มีความแม่นยำสองเท่า (64 บิต) และทศนิยมเป็นชนิดข้อมูลจุดลอยตัว 128 บิต
Float - 32 บิต (7 หลัก)
สอง - 64 บิต (15-16 หลัก)
ทศนิยม - 128 บิต (28-29 หลักสำคัญ)
เพิ่มเติมเกี่ยวกับ ... ความแตกต่างระหว่างทศนิยมลอยและดับเบิล
ปัญหาเกี่ยวกับประเภทเหล่านี้ทั้งหมดคือว่ามีบางอย่างไม่แน่ชัดว่ามีอยู่หรือไม่และปัญหานี้อาจเกิดขึ้นกับตัวเลขทศนิยมขนาดเล็กเช่นในตัวอย่างต่อไปนี้
Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1
If fMean - fDelta < fLimit Then
bLower = True
Else
bLower = False
End If
คำถาม: ตัวแปร bLower ประกอบด้วยค่าใด?
คำตอบ: บนเครื่อง 32 บิต bLower ประกอบด้วย TRUE !!!
ถ้าฉันแทนที่ Double ด้วย Decimal, bLower มี FALSE ซึ่งเป็นคำตอบที่ดี
สองเท่าปัญหาคือ fMean-fDelta = 1.09999999999 ที่ต่ำกว่า 1.1
ข้อควรระวัง: ฉันคิดว่าปัญหาเดียวกันนี้สามารถเกิดขึ้นได้กับตัวเลขอื่นเนื่องจากทศนิยมเป็นเพียงสองเท่าที่มีความแม่นยำสูงกว่าและความแม่นยำก็มีขีด จำกัด อยู่เสมอ
ในความเป็นจริง Double, Float และ Decimal สอดคล้องกับทศนิยม BINARY ใน COBOL!
เป็นเรื่องน่าเศร้าที่ประเภทตัวเลขอื่น ๆ ที่ใช้ใน COBOL ไม่มีอยู่ใน. Net สำหรับผู้ที่ไม่ทราบภาษาโคบอลมีอยู่ในภาษาโคบอลประเภทต่อไปนี้เป็นตัวเลข
BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte)
ในคำง่าย ๆ :
/==========================================================================================
Type Bits Have up to Approximate Range
/==========================================================================================
float 32 7 digits -3.4 × 10 ^ (38) to +3.4 × 10 ^ (38)
double 64 15-16 digits ±5.0 × 10 ^ (-324) to ±1.7 × 10 ^ (308)
decimal 128 28-29 significant digits ±7.9 x 10 ^ (28) or (1 to 10 ^ (28)
/==========================================================================================
คุณสามารถอ่านเพิ่มเติมได้ที่นี่ , ลอย ,คู่และทศนิยม
Decimalเหมาะสำหรับการใช้งานทางการเงินและเป็นเกณฑ์หลักในการใช้งานเมื่อตัดสินใจระหว่างและDecimal Doubleมันยากที่Doubleความแม่นยำนั้นไม่เพียงพอสำหรับการใช้งานทางวิทยาศาสตร์เช่น (และDecimalมักจะไม่เหมาะสมสำหรับการใช้งานทางวิทยาศาสตร์เนื่องจากมีช่วง จำกัด )
ความแตกต่างที่สำคัญระหว่างกันคือความแม่นยำ
floatคือ32-bitตัวเลขdoubleคือ64-bitตัวเลขและdecimalเป็น128-bitตัวเลข
ทศนิยม 128 บิต (28-29 หลักสำคัญ) ในกรณีของการใช้งานทางการเงินควรใช้ประเภททศนิยมเพราะให้ความแม่นยำระดับสูงและง่ายต่อการหลีกเลี่ยงข้อผิดพลาดในการปัดเศษใช้ทศนิยมสำหรับคณิตศาสตร์ที่ไม่ใช่จำนวนเต็มที่ต้องการความแม่นยำ (เช่น เงินและสกุลเงิน)
Double 64 bit (15-16 หลัก) Double Type เป็นประเภทข้อมูลที่ใช้งานมากที่สุดสำหรับค่าจริงยกเว้นการจัดการเงิน ใช้สองเท่าสำหรับคณิตศาสตร์ที่ไม่ใช่จำนวนเต็มซึ่งไม่จำเป็นต้องใช้คำตอบที่แม่นยำที่สุด
Float 32 บิต (7 หลัก) ส่วนใหญ่จะใช้ในไลบรารีกราฟิกเพราะความต้องการพลังการประมวลผลสูงมากรวมทั้งใช้สถานการณ์ที่สามารถทนต่อข้อผิดพลาดในการปัดเศษ
Decimalsช้ากว่าdouble/floatมาก
DecimalsและFloats/Doublesไม่สามารถเปรียบเทียบได้โดยไม่ต้องใช้นักแสดงในขณะที่FloatsและDoublesสามารถ
Decimals อนุญาตการเข้ารหัสหรือต่อท้ายเลขศูนย์
คุณต้องพูดถึงค่าเป็น:
Decimal dec = 12M/6;
Double dbl = 11D/6;
float fl = 15F/6;
และตรวจสอบผลลัพธ์
Float - 4
Double - 8
Decimal - 12