อะไรคือความแตกต่างระหว่าง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.1
float
ที่สามารถแสดงว่าเป็น แน่นอนด้วยไบนารีลอย(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 บิต!)
Real
IIRC นั้นสามารถแสดงค่าได้ถึง 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.MaxValue
decimal.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 หลัก สำหรับdouble
s คุณสามารถมีได้สูงสุด 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