1. วิธีการปัดเศษการปัดเศษเป็นวิธีการคำนวณโดยประมาณที่ใช้กันอย่างแพร่หลายซึ่งรวมถึงสองประเภท: วิธีการปัดเศษเลขคณิตและวิธีการปัดเศษของนายธนาคาร วิธีการปัดเศษเลขคณิตที่เรียกว่าเป็นวิธีการปัดเศษในแง่ปกติของเรา กฎคือ: เมื่อค่าของบิตที่ถูกทอดทิ้งมากกว่าหรือเท่ากับ 5 บิตจะถูกถอนออกในขณะที่บิตถูกถอนออก วิธีการปัดเศษของนายธนาคารที่เรียกว่าเป็นวิธีการปัดเศษสี่รอบหกเป็นห้าและรักษาสองเท่า (หรือที่เรียกว่าการปัดเศษหกเป็นห้าคี่และคู่) กฎคือ: เมื่อค่าของบิตที่ถูกทอดทิ้งน้อยกว่า 5 บิตจะถูกทอดทิ้งโดยตรง เมื่อค่าของบิตด้านซ้ายถูกทอดทิ้งเมื่อเท่ากับ 5 ถ้าค่าของตัวเลขก่อนหน้านี้เป็นคี่บิตจะลดลงในขณะที่บิตจะลดลง โดยตรง. โดยสรุปแล้วผลลัพธ์ที่ได้จากวิธีการปัดเศษทั้งสองนั้นไม่สอดคล้องกันดังนั้นพวกเขาจึงต้องแยกแยะตามความต้องการที่แท้จริงเมื่อใช้ มิฉะนั้นการเบี่ยงเบนที่อธิบายไม่ได้บางอย่างจะเกิดขึ้น 2. ฟังก์ชั่นการปัดเศษใน Delphi เป็นที่รู้จักกันดี อย่างไรก็ตามมันใช้การดำเนินการปัดเศษตามกฎของวิธีการปัดเศษของนายธนาคาร การใช้ฟังก์ชั่นการปัดเศษใน Delphi มักจะใช้รอบ แต่บางครั้งฉันก็พบว่าคำตอบที่ได้จากการใช้มันจะแตกต่างจากที่เราคาดไว้ ตัวอย่างเช่น: i: = Round (11.5) ผลลัพธ์: i = 12i: = Round (10.5) ผลลัพธ์: i = 10 ใช่ตามความคาดหวังของเราฟังก์ชั่นที่สองควรกลับมา 11 แต่ทำไมสิ่งนี้จึงเกิดขึ้น? สำหรับ xxx.5 ชิ้นส่วนจำนวนเต็มเป็นจำนวนคี่จากนั้นปัดเศษขึ้นจะถูกปัดเศษลง มันเป็นข้อผิดพลาดของ Delphi หรือไม่? โปรเซสเซอร์นี้ใช้วิธีการปัดเศษของนายธนาคารที่เรียกว่านั่นคือเมื่อใช้ฟังก์ชันรอบกับค่ากลาง (เช่น 5.5, 6.5) โปรเซสเซอร์จะกำหนดว่าการปัดเศษขึ้นอยู่กับลักษณะแปลก ๆ และแม้กระทั่งจำนวนก่อน จุดทศนิยมเช่น 5.5 รอบผลลัพธ์คือ 6 และผลลัพธ์ของ 6.5 รอบคือ 6 เพราะ 6 เป็นจำนวนคู่ ฟังก์ชั่นรอบจริงใช้อัลกอริทึมของนายธนาคารสำหรับการดำเนินงานและโดยทั่วไปจะใช้ทางสถิติในการใช้อัลกอริทึมนี้ซึ่งเป็นวิทยาศาสตร์มากกว่าวิธีการปัดเศษแบบดั้งเดิมของเรา มีคนแก้ไขด้วยวิธีนี้เพิ่มค่าที่น้อยมากถึง 10.5 แล้วเรียกฟังก์ชั่นรอบด้วยวิธีนี้โดยไม่ส่งผลกระทบต่อความถูกต้อง สาเหตุที่แท้จริง พบฟังก์ชั่นอื่นบนอินเทอร์เน็ต: ฟังก์ชั่น Doround (Extended): Int64; = ค่าเริ่มต้น 8087cw; มันเป็นค่าของคำควบคุมตัวควบคุมจุดลอยตัว (FPU) ใน CPU แนวคิดของโปรแกรมข้างต้นนั้นง่ายมากซึ่งคือการประหยัด 8087CW ก่อนจากนั้นตั้งค่าให้เป็นปัดเศษขึ้นเพื่อให้เมื่อตัวเลขไม่ได้อยู่ในรอบและในที่สุดก็คืนค่า 8087CW ในความเป็นจริงฟังก์ชั่นข้างต้นสามารถทำให้ง่ายขึ้น OldCW: = ค่าเริ่มต้น 8087CW; ทางออกหนึ่ง ในความเป็นจริงบอร์แลนด์คิดมานานแล้วว่าเราจะพบปัญหาดังกล่าวและคิดว่าเราจำเป็นต้องปรับแต่งโหมดการปัดเศษของ FPU ดังนั้นจึงให้ฟังก์ชั่นสำเร็จรูปเพื่อให้เราใช้ ในหน่วยคณิตศาสตร์มีฟังก์ชั่น setRoundMode ด้านล่างเป็นฟังก์ชั่นการปัดเศษ I Encapsulated: Function (Extended; RoundMode: TFPuroundingMode = RMUP): Int64; Var rm: TfpuroundingMode; SetRoundMode (RM); end; end; ตัวอย่าง: i: = roundex (11.5) ผลลัพธ์: i = 12i: = roundex (10.5) ผลลัพธ์: i = 11 ดีนั่นจะเกิดอะไรขึ้น ผ้า? ตัวอย่างเช่น: i: = Roundex (11.5, Rmtruncate) ผลลัพธ์: i = 11i: = Roundex (10.5, rmtruncate) ผลลัพธ์: i = 10 roundex ฟังก์ชั่นถูกเปลี่ยนเป็นฟังก์ชั่น trunc อย่างงดงาม