ตัวอย่าง:
float timeRemaining = 0.58f;
เหตุใดจึงf
ต้องระบุต่อท้ายตัวเลขนี้
ตัวอย่าง:
float timeRemaining = 0.58f;
เหตุใดจึงf
ต้องระบุต่อท้ายตัวเลขนี้
double & int
คำตอบ:
การประกาศลอยของคุณประกอบด้วยสองส่วน:
timeRemaining
float
0.58
ให้กับตัวแปรนี้ปัญหาเกิดขึ้นในส่วนที่ 2
ด้านขวามือจะได้รับการประเมินด้วยตนเอง ตามข้อกำหนด C # ตัวเลขที่มีจุดทศนิยมที่ไม่มีคำต่อท้ายจะถูกตีความว่าเป็นdouble
.
ดังนั้นตอนนี้เรามีค่าที่เราต้องการที่จะกำหนดให้กับตัวแปรประเภทdouble
float
เพื่อที่จะทำเช่นนี้จะต้องมีการแปลงนัยจากการdouble
float
ไม่มีการแปลงดังกล่าวเนื่องจากคุณอาจ (และในกรณีนี้) สูญเสียข้อมูลในการแปลง
เหตุผลก็คือค่าที่คอมไพเลอร์ใช้ไม่ใช่ 0.58 จริง ๆ แต่เป็นค่าทศนิยมที่ใกล้เคียงที่สุดกับ 0.58 ซึ่งก็คือ 0.57999999999999978655962351581366 ... สำหรับdouble
0.579999946057796478271484375 สำหรับfloat
.
พูดอย่างเคร่งครัดf
ไม่จำเป็นต้องใช้ คุณสามารถหลีกเลี่ยงการใช้f
คำต่อท้ายได้โดยการส่งค่าเป็นfloat
:
float timeRemaining = (float)0.58;
(float) 0.58
ทำงานอย่างไร คุณบอกก่อนหน้านี้ว่าไม่มีการแปลงเนื่องจากข้อมูลอาจสูญหายแล้วนักแสดงจะทำงานได้อย่างไร?
2.4
ถูกตีความว่าเป็นสองเท่าในทุกที่ 2. ไม่อนุญาตให้มีการ จำกัด การแปลงโดยนัย (เช่นจากคู่เป็นลอย) หากคุณต้องการยกเว้นกฎเหล่านี้คุณต้องมีเหตุผลที่ดีมาก การประหยัดจังหวะสำคัญ 1 ครั้งไม่น่าจะดีพอ
เพราะมีหลายประเภทที่เป็นตัวเลขหลายอย่างที่คอมไพเลอร์สามารถใช้เพื่อเป็นตัวแทนของความคุ้มค่า0.58
: float
, และdouble
decimal
เว้นแต่คุณจะตกลงกับคอมไพลเลอร์ที่เลือกมาให้คุณคุณต้องแยกความคลุมเครือ
เอกสารสำหรับdouble
ระบุว่าถ้าคุณไม่ระบุประเภทด้วยตัวเองคอมไพเลอร์จะเลือกdouble
เป็นประเภทของลิเทอรัลตัวเลขจริงเสมอ:
ตามค่าเริ่มต้นลิเทอรัลตัวเลขจริงทางด้านขวาของตัวดำเนินการกำหนดจะถือว่าเป็นสองเท่า อย่างไรก็ตามหากคุณต้องการให้จำนวนเต็มถือว่าเป็นสองเท่าให้ใช้คำต่อท้าย d หรือ D
การต่อท้ายคำต่อท้ายf
จะสร้างfloat
; คำต่อท้ายd
สร้างdouble
; คำต่อท้ายm
จะสร้างไฟล์decimal
. ทั้งหมดนี้ยังใช้ตัวพิมพ์ใหญ่
อย่างไรก็ตามสิ่งนี้ยังไม่เพียงพอที่จะอธิบายว่าเหตุใดจึงไม่รวบรวม:
float timeRemaining = 0.58;
ครึ่งหนึ่งของคำตอบที่หายไปคือการแปลงจากเป็นdouble
0.58
ไปเป็นfloat
timeRemaining
ข้อมูลที่อาจสูญเสียไปดังนั้นคอมไพเลอร์จึงปฏิเสธที่จะนำไปใช้โดยปริยาย หากคุณเพิ่มการร่ายอย่างชัดเจนการแปลงจะดำเนินการ หากคุณเพิ่มf
คำต่อท้ายก็ไม่จำเป็นต้องมีการแปลง ในทั้งสองกรณีโค้ดจะคอมไพล์
int
double
double a = 0.69f;
ใช่หรือไม่?
float
double
ไป
ปัญหาคือ. NET เพื่อให้การดำเนินการโดยนัยบางประเภทสามารถดำเนินการที่เกี่ยวข้องfloat
และdouble
จำเป็นต้องระบุอย่างชัดเจนว่าจะเกิดอะไรขึ้นในทุกสถานการณ์ที่เกี่ยวข้องกับตัวถูกดำเนินการแบบผสมหรืออื่น ๆ ที่อนุญาตให้ทำการแปลงโดยนัยระหว่างประเภทในรูปแบบเดียว ทิศทางเท่านั้น ไมโครซอฟท์เลือกที่จะทำตามผู้นำของ Java ในการอนุญาตทิศทางที่บางครั้งให้ความสำคัญกับความแม่นยำ แต่มักจะเสียสละความถูกต้องและมักสร้างความยุ่งยาก
ในเกือบทุกกรณีการรับdouble
ค่าที่ใกล้เคียงที่สุดกับปริมาณตัวเลขเฉพาะและกำหนดให้กับ a float
จะให้float
ค่าที่ใกล้เคียงกับปริมาณเดียวกันมากที่สุด มีบางกรณีมุมเช่นมูลค่า 9,007,199,791,611,905; การfloat
แสดงที่ดีที่สุดคือ 9,007,200,328,482,816 (ซึ่งลดลง 536,870,911) แต่การคัดเลือกdouble
ตัวแทนที่ดีที่สุด(เช่น 9,007,199,791,611,904) จะให้float
ผล 9,007,199,254,740,992 (ซึ่งลดลง 536,870,913) โดยทั่วไปแล้วการแปลงการdouble
แทนค่าที่ดีที่สุดของปริมาณบางส่วนให้float
เป็นการนำเสนอที่ดีที่สุดเท่าที่จะเป็นไปได้float
หรือการแสดงหนึ่งในสองการแสดงที่ดีพอ ๆ กัน
โปรดสังเกตว่าพฤติกรรมที่พึงปรารถนานี้ใช้ได้แม้ในขั้นสุดขั้ว ตัวอย่างเช่นการfloat
แทนค่าที่ดีที่สุดสำหรับปริมาณ 10 ^ 308 จะตรงกับการfloat
แทนค่าที่ทำได้โดยการแปลงการdouble
แทนค่าที่ดีที่สุดของปริมาณนั้น ในทำนองเดียวกันการfloat
แทนค่าที่ดีที่สุดของ 10 ^ 309 จะตรงกับการfloat
แทนค่าที่ได้จากการแปลงการdouble
แทนค่าที่ดีที่สุดของปริมาณนั้น
น่าเสียดายที่การแปลงในทิศทางที่ไม่ต้องใช้การแคสต์อย่างชัดเจนนั้นแทบจะไม่มีความแม่นยำ การแปลงการfloat
แสดงค่าที่ดีที่สุดเป็นdouble
แทบจะไม่ให้ผลใด ๆ โดยเฉพาะอย่างยิ่งใกล้เคียงกับการdouble
แสดงค่าที่ดีที่สุดและในบางกรณีผลลัพธ์อาจผิดไปจากลำดับความสำคัญหลายร้อย (เช่นการแปลงค่าที่ดีที่สุดfloat
ของ 10 ^ 40 เพื่อdouble
ให้ได้ผล ค่าที่เปรียบเทียบมากกว่าค่าที่ดีที่สุดdouble
ของ 10 ^ 300
อนิจจากฎการแปลงคือสิ่งที่เป็นดังนั้นเราจึงต้องใช้ชีวิตโดยใช้ตัวพิมพ์และคำต่อท้ายโง่ ๆ เมื่อแปลงค่าไปในทิศทางที่ "ปลอดภัย" และระวังตัวพิมพ์โดยนัยในทิศทางที่เป็นอันตรายซึ่งมักจะให้ผลลัพธ์ที่ผิดพลาด
double
อาจจะเป็นเพราะมิฉะนั้นก็จะได้รับการปฏิบัติ