ตัวอย่าง:
float timeRemaining = 0.58f;
เหตุใดจึงfต้องระบุต่อท้ายตัวเลขนี้
ตัวอย่าง:
float timeRemaining = 0.58f;
เหตุใดจึงfต้องระบุต่อท้ายตัวเลขนี้
double & int
คำตอบ:
การประกาศลอยของคุณประกอบด้วยสองส่วน:
timeRemainingfloat0.58ให้กับตัวแปรนี้ปัญหาเกิดขึ้นในส่วนที่ 2
ด้านขวามือจะได้รับการประเมินด้วยตนเอง ตามข้อกำหนด C # ตัวเลขที่มีจุดทศนิยมที่ไม่มีคำต่อท้ายจะถูกตีความว่าเป็นdouble.
ดังนั้นตอนนี้เรามีค่าที่เราต้องการที่จะกำหนดให้กับตัวแปรประเภทdouble floatเพื่อที่จะทำเช่นนี้จะต้องมีการแปลงนัยจากการdouble floatไม่มีการแปลงดังกล่าวเนื่องจากคุณอาจ (และในกรณีนี้) สูญเสียข้อมูลในการแปลง
เหตุผลก็คือค่าที่คอมไพเลอร์ใช้ไม่ใช่ 0.58 จริง ๆ แต่เป็นค่าทศนิยมที่ใกล้เคียงที่สุดกับ 0.58 ซึ่งก็คือ 0.57999999999999978655962351581366 ... สำหรับdouble0.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;ใช่หรือไม่?
floatdoubleไป
ปัญหาคือ. 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อาจจะเป็นเพราะมิฉะนั้นก็จะได้รับการปฏิบัติ